昨天寫了一篇PermissionsDispatcher初探为居,文章最后說要用java重寫processor模塊,今天花了半天時間完成吆玖,現(xiàn)在把代碼放在github上:https://github.com/ileelay/PermissionsDispatcher/tree/2.2.0j怠噪,歡迎大家糾正嗜憔!同時感慨到Kotlin太強大木缝,Java太繁瑣;
雖然Kotlin語法很簡練围辙,終究還是基于JVM我碟,同時這篇文章不是循序漸進的Kotlin語法講解,只是為了記錄在轉(zhuǎn)PermissionsDispatcher時的粗略見解姚建;
普通class
kotlin是這樣子寫的
class NoParametersAllowedException(e: ExecutableElement) : RuntimeException("Method '${e.simpleString()}()' must not have any parameters")
為了保持參數(shù)一致矫俺,我用java是這樣寫的:
public class NoParametersAllowedException extends RuntimeException {
public static RuntimeException getInstance(ExecutableElement e) {
return new NoParametersAllowedException("Method "+e.getSimpleName().toString()+" must not have any parameters");
}
private NoParametersAllowedException(String s) {
super(s);
}
}
常量的定義
kotlin這樣
//Constants.kt
val FILE_COMMENT = "This file was generated by PermissionsDispatcher. Do not modify!"
val GEN_CLASS_SUFFIX = "PermissionsDispatcher"
val GEN_REQUESTCODE_PREFIX = "REQUEST_"
val GEN_PERMISSION_PREFIX = "PERMISSION_"
val GEN_PENDING_PREFIX = "PENDING_"
val GEN_WITHCHECK_SUFFIX = "WithCheck"
val GEN_PERMISSIONREQUEST_SUFFIX = "PermissionRequest"
說實話,kotlin這樣寫好變態(tài)掸冤,連class關(guān)鍵字都不用聲明厘托,我用java也盡量保持簡潔,可還是比不過它稿湿;
public interface Constants {
String FILE_COMMENT = "This file was generated by PermissionsDispatcher. Do not modify!";
String GEN_CLASS_SUFFIX = "PermissionsDispatcher";
String GEN_REQUESTCODE_PREFIX = "REQUEST_";
String GEN_PERMISSION_PREFIX = "PERMISSION_";
String GEN_PENDING_PREFIX = "PENDING_";
String GEN_WITHCHECK_SUFFIX = "WithCheck";
String GEN_PERMISSIONREQUEST_SUFFIX = "PermissionRequest";
}
Extensions
//Extensions.kt
fun TypeMirror.simpleString(): String {
val toString: String = this.toString()
val indexOfDot: Int = toString.lastIndexOf('.')
return if (indexOfDot == -1) toString else toString.substring(indexOfDot + 1)
}
//調(diào)用
typeMirror.simpleString()
這個用java寫就比較尷尬了铅匹,我是用工具類,功能可以實現(xiàn)缎罢,但還是沒法保持統(tǒng)一的調(diào)用方式伊群;
//Extensions.java
public static String TypeMirrorSimpleString(TypeMirror typeMirror) {
String toString = typeMirror.toString();
int indexOfDot = toString.lastIndexOf('.');
if (indexOfDot == -1)
return toString;
else
return toString.substring(indexOfDot + 1);
}
//調(diào)用
Extensions.TypeMirrorSimpleString(typeMirror);
初始化一個List
processorUnits = listOf(ActivityProcessorUnit(),SupportFragmentProcessorUnit(),NativeFragmentProcessorUnit())
用java咋寫,尷尬了
processorUnits = new ArrayList<ProcessorUnit>();
processorUnits.add(new ActivityProcessorUnit());
processorUnits.add(new SupportFragmentProcessorUnit());
processorUnits.add(new NativeFragmentProcessorUnit());
Safe Call (?. ?:)
先看這一段懵逼的代碼
//ADD_WITH_CHECK_BODY_MAP是一個HashMap
ADD_WITH_CHECK_BODY_MAP[needsPermissionParameter]?.addHasSelfPermissionsCondition(builder, activityVar, permissionField) ?: builder.beginControlFlow("if (\$T.hasSelfPermissions(\$N, \$N))", PERMISSION_UTILS, activityVar, permissionField)
用Java理解是啥樣子
SensitivePermissionInterface anInterface = ADD_WITH_CHECK_BODY_MAP.get(needsPermissionParameter);
if (anInterface != null) {
anInterface.addHasSelfPermissionsCondition(builder, activityVar, permissionField);
} else {
builder.beginControlFlow("if ($T.hasSelfPermissions($N, $N))", PERMISSION_UTILS, activityVar, permissionField);
}