සිට JSR 305 (එහි අරමුණ ප්රමිතිකරණය විය @NonNullහා @Nullable) වසර ගණනාවක් පුරාවට උදාසීනව කර ඇත, මට කිසිම හොඳ උත්තරයක් නැහැ කියලා මට බයයි. අපට කළ හැක්කේ ප්රායෝගික විසඳුමක් සෙවීම සහ මගේ පහත පරිදි වේ:
සින්ටැක්ස්
තනිකරම ශෛලීය දෘෂ්ටි කෝණයකින්, ජාවා හැර IDE, රාමුව හෝ මෙවලම් කට්ටලය පිළිබඳ කිසිදු සඳහනක් මග හැරීමට මම කැමැත්තෙමි.
මෙය බැහැර කරයි:
android.support.annotation
edu.umd.cs.findbugs.annotations
org.eclipse.jdt.annotation
org.jetbrains.annotations
org.checkerframework.checker.nullness.qual
lombok.NonNull
එය අපව එක්කෝ javax.validation.constraintsහෝ අතහැර දමයි javax.annotation. හිටපු තැනැත්තා JEE සමඟ පැමිණේ. මෙය වඩා හොඳ නම් javax.annotation, එය අවසානයේ ජේඑස්ඊ සමඟ පැමිණිය හැකි හෝ කිසිසේත් නොවිය හැකිය. මම පුද්ගලිකව කැමතියි javax.annotationමම JEE යැපීමට අකමැති නිසා.
මෙය අප අතහැර යයි
javax.annotation
එය කෙටිම එක ද වේ.
වඩා හොඳ වනු ඇත්තේ එක් වාක්ය ඛණ්ඩයක් පමණි : java.annotation.Nullable. අනෙකුත් මෘදුකාංග පැකේජ මඟින් උපාධිය ලෙස javaxකිරීමට javaපසුගිය දී, javax.annotation නිවැරදි දිශාව පියවරක් වනු ඇත.
ක්රියාත්මක කිරීම
මම බලාපොරොත්තු වූයේ ඔවුන් සියල්ලන්ටම මූලික වශයෙන් එකම සුළු ක්රියාවලියක් ඇති බවය, නමුත් සවිස්තරාත්මක විශ්ලේෂණයකින් පෙනී ගියේ මෙය සත්ය නොවන බවයි.
පළමුව සමානකම් සඳහා:
මෙම @NonNullවිවරණයන් ඉදිරිපත් සියලු රේඛා
public @interface NonNull {}
හැර
org.jetbrains.annotationsඑය එය හඳුන්වන @NotNullඅතර සුළු ක්රියාවලියක් ඇත
javax.annotation එය දිගු කාලයක් ක්රියාත්මක කරයි
javax.validation.constraintsඑය ද එය හඳුන්වන @NotNullඅතර ක්රියාත්මක කිරීමක් ඇත
මෙම @Nullableවිවරණයන් ඉදිරිපත් සියලු රේඛා
public @interface Nullable {}
( org.jetbrains.annotationsසුළු වශයෙන් ) ඒවා සුළු වශයෙන් ක්රියාත්මක කිරීම හැර.
වෙනස්කම් සඳහා:
කැපී පෙනෙන එකක් එයයි
javax.annotation
javax.validation.constraints
org.checkerframework.checker.nullness.qual
සියල්ලටම ධාවන කාල විවරණ ( @Retention(RUNTIME)) ඇත
android.support.annotation
edu.umd.cs.findbugs.annotations
org.eclipse.jdt.annotation
org.jetbrains.annotations
සම්පාදනය කරන කාලය පමණි ( @Retention(CLASS)).
මෙම SO පිළිතුරෙහි විස්තර කර ඇති පරිදි, ධාවන කාල විවරණ වල බලපෑම යමෙකු සිතනවාට වඩා කුඩා වේ, නමුත් ඒවා සම්පාදනය කරන කාලයට අමතරව ධාවන කාල පරීක්ෂාවන් කිරීමට මෙවලම් සක්රීය කිරීමේ වාසිය ඇත.
තවත් වැදගත් වෙනසක් වන්නේ කේතයේ විවරණ භාවිතා කළ හැකි ස්ථානයයි . වෙනස් ප්රවේශයන් දෙකක් තිබේ. සමහර පැකේජ JLS 9.6.4.1 විලාසිතාවේ සන්දර්භ භාවිතා කරයි. පහත වගුව දළ විශ්ලේෂණයක් ලබා දෙයි:
FIELD METHOD PARAMETER LOCAL_VARIABLE
android.support.annotation XXX
edu.umd.cs.findbugs.annotations XXXX
org.jetbrains.annotation XXXX
ලොම්බොක් XXXX
javax.validation.constraints XXX
org.eclipse.jdt.annotation, javax.annotationසහ org.checkerframework.checker.nullness.qualජේඑල්එස් 4.11 හි අර්ථ දක්වා ඇති සන්දර්භයන් භාවිතා කරන්න, එය කළ හැකි නිවැරදි ක්රමය මගේ අදහසයි.
මෙය අප අතහැර යයි
javax.annotation
org.checkerframework.checker.nullness.qual
මෙම වටයේ.
කේතය
වැඩිදුර විස්තර ඔබම සංසන්දනය කිරීමට ඔබට උපකාර කිරීම සඳහා මම පහත දැක්වෙන සෑම විවරණයක කේතය ලැයිස්තුගත කරමි. සංසන්දනය පහසු කිරීම සඳහා මම අදහස්, ආනයන සහ @Documentedව්යාඛ්යාව ඉවත් කළෙමි . ( @Documentedඇන්ඩ්රොයිඩ් පැකේජයේ පන්ති හැර ඔවුන් සියල්ලන්ටම තිබුණි ). මම රේඛා සහ @Targetක්ෂේත්ර නැවත සකස් කර සුදුසුකම් සාමාන්යකරණය කළෙමි .
package android.support.annotation;
@Retention(CLASS)
@Target({FIELD, METHOD, PARAMETER})
public @interface NonNull {}
package edu.umd.cs.findbugs.annotations;
@Retention(CLASS)
@Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE})
public @interface NonNull {}
package org.eclipse.jdt.annotation;
@Retention(CLASS)
@Target({ TYPE_USE })
public @interface NonNull {}
package org.jetbrains.annotations;
@Retention(CLASS)
@Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE})
public @interface NotNull {String value() default "";}
package javax.annotation;
@TypeQualifier
@Retention(RUNTIME)
public @interface Nonnull {
When when() default When.ALWAYS;
static class Checker implements TypeQualifierValidator<Nonnull> {
public When forConstantValue(Nonnull qualifierqualifierArgument,
Object value) {
if (value == null)
return When.NEVER;
return When.ALWAYS;
}
}
}
package org.checkerframework.checker.nullness.qual;
@Retention(RUNTIME)
@Target({TYPE_USE, TYPE_PARAMETER})
@SubtypeOf(MonotonicNonNull.class)
@ImplicitFor(
types = {
TypeKind.PACKAGE,
TypeKind.INT,
TypeKind.BOOLEAN,
TypeKind.CHAR,
TypeKind.DOUBLE,
TypeKind.FLOAT,
TypeKind.LONG,
TypeKind.SHORT,
TypeKind.BYTE
},
literals = {LiteralKind.STRING}
)
@DefaultQualifierInHierarchy
@DefaultFor({TypeUseLocation.EXCEPTION_PARAMETER})
@DefaultInUncheckedCodeFor({TypeUseLocation.PARAMETER, TypeUseLocation.LOWER_BOUND})
public @interface NonNull {}
සම්පූර්ණත්වය සඳහා, මෙන්න @Nullableක්රියාත්මක කිරීම්:
package android.support.annotation;
@Retention(CLASS)
@Target({METHOD, PARAMETER, FIELD})
public @interface Nullable {}
package edu.umd.cs.findbugs.annotations;
@Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE})
@Retention(CLASS)
public @interface Nullable {}
package org.eclipse.jdt.annotation;
@Retention(CLASS)
@Target({ TYPE_USE })
public @interface Nullable {}
package org.jetbrains.annotations;
@Retention(CLASS)
@Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE})
public @interface Nullable {String value() default "";}
package javax.annotation;
@TypeQualifierNickname
@Nonnull(when = When.UNKNOWN)
@Retention(RUNTIME)
public @interface Nullable {}
package org.checkerframework.checker.nullness.qual;
@Retention(RUNTIME)
@Target({TYPE_USE, TYPE_PARAMETER})
@SubtypeOf({})
@ImplicitFor(
literals = {LiteralKind.NULL},
typeNames = {java.lang.Void.class}
)
@DefaultInUncheckedCodeFor({TypeUseLocation.RETURN, TypeUseLocation.UPPER_BOUND})
public @interface Nullable {}
පහත දැක්වෙන පැකේජ දෙකෙහි නොමැත @Nullable, එබැවින් මම ඒවා වෙන වෙනම ලැයිස්තුගත කරමි; ලොම්බොක් සතුව ඉතා කම්මැලි ය @NonNull. දී javax.validation.constraintsඇති @NonNullඇත්තටම වේ @NotNull
හා එය longish ක්රියාත්මක වේ.
package lombok;
@Retention(CLASS)
@Target({FIELD, METHOD, PARAMETER, LOCAL_VARIABLE})
public @interface NonNull {}
package javax.validation.constraints;
@Retention(RUNTIME)
@Target({ FIELD, METHOD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Constraint(validatedBy = {})
public @interface NotNull {
String message() default "{javax.validation.constraints.NotNull.message}";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default {};
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@interface List {
NotNull[] value();
}
}
සහාය
මගේ අත්දැකීම් අනුව, javax.annotationඅවම වශයෙන් සූර්යග්රහණය සහ චෙක්කර් රාමුව කොටුවෙන් පිටත සහාය දක්වයි.
සාරාංශය
මගේ පරමාදර්ශී විවරණය වනුයේ java.annotationචෙකර් රාමු ක්රියාත්මක කිරීම සමඟ ඇති වාක්ය ඛණ්ඩයයි.
ඔබ චෙකර් රාමුව භාවිතා කිරීමට අදහස් නොකරන්නේ නම් javax.annotation( JSR-305 ) දැනට ඔබගේ හොඳම ඔට්ටුවයි.
ඔබ චෙක්කර් රාමුවට මිලදී ගැනීමට කැමති නම් ඒවා භාවිතා කරන්න org.checkerframework.checker.nullness.qual.
මුලාශ්ර
android.support.annotation සිට android-5.1.1_r1.jar
edu.umd.cs.findbugs.annotations සිට findbugs-annotations-1.0.0.jar
org.eclipse.jdt.annotation සිට org.eclipse.jdt.annotation_2.1.0.v20160418-1457.jar
org.jetbrains.annotations සිට jetbrains-annotations-13.0.jar
javax.annotation සිට gwt-dev-2.5.1-sources.jar
org.checkerframework.checker.nullness.qual සිට checker-framework-2.1.9.zip
lombokසිට lombokසිදුf6da35e4c4f3305ecd1b415e2ab1b9ef8a9120b4
javax.validation.constraints සිට validation-api-1.0.0.GA-sources.jar