Ich versuche @IntDef
Annotation in Android-Entwicklung zu implementieren.Android - Ist es in Ordnung, @IntDef-Werte in @interface zu setzen?
Erste Methode: es sieht gut aus mit der Definition in einer Constant.java
Klasse getrennt:
public class Constant {
@IntDef(value={SORT_PRICE, SORT_TIME, SORT_DURATION})
@Retention(RetentionPolicy.SOURCE)
public @interface SortType{}
public static final int SORT_PRICE = 0;
public static final int SORT_TIME = 1;
public static final int SORT_DURATION = 2;
}
Verbrauch:
@Constant.SortType int sortType = Constant.SORT_PRICE;
Aber die Dinge viel unordentlicher bekommen, wenn es mehrere Definition ist (zB Usertype , StoreType, usw.) in einer Datei.
Zweite Methode: So kam ich mit so etwas zu trennen Werte zwischen Definition bis:
public class Constant {
@IntDef(value={SortType.SORT_PRICE, SortType.SORT_TIME, SortType.SORT_DURATION})
@Retention(RetentionPolicy.SOURCE)
public @interface SortTypeDef{}
public static class SortType{
public static final int PRICE = 0;
public static final int TIME = 1;
public static final int DURATION = 2;
}
}
Verbrauch:
@Constant.SortTypeDef int sortType = Constant.SortType.PRICE;
Aber wie Sie sehen können, habe ich zwei verschiedene Namen erstellt dafür: SortTypeDef
und SortType
Dritte Met hod: Ich habe versucht, die Liste der möglichen Werte innerhalb @interface
zu bewegen:
public class Constant {
@IntDef(value={SortType.SORT_PRICE, SortType.SORT_TIME, SortType.SORT_DURATION})
@Retention(RetentionPolicy.SOURCE)
public @interface SortType{
int PRICE = 0;
int TIME = 1;
int DURATION = 2;
}
}
Nutzungs
@Constant.SortType int sortType = Constant.SortType.PRICE;
Während es funktioniert, ich weiß nicht, was ist der Nachteil. Ist es in Ordnung, die möglichen Werte von @IntDef
in @interface
zu setzen? Gibt es Leistungsunterschiede zwischen den drei oben genannten Methoden?
Haben Sie gefunden eine Lösung für diese Frage? Ich frage mich das gleiche jetzt ... –
@IgorGanapolsky noch nicht, aber ich verwende weiterhin die dritte Methode auf den Produktionscode und bis jetzt kein Problem. Ich denke, der beste Weg, dies zu überprüfen, ist das Profiling (Nutzung, Anzahl der Konstanten usw.). –
Die IntDef-Annotation hat nur RetentionPolicy.SOURCE und wird daher nur von Compiler-Annotationsprozessoren verwendet. Es ist nicht möglich, dass es sich auf die Laufzeitleistung auswirkt, es sei denn, der Annotationsprozessor tut etwas sehr Esoterisches, z. B. Bytecode-Weben oder Codegenerierung, um Laufzeitprüfungen in den Code einzufügen. –