සිට 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