যেহেতু জেএসআর 305 (যার লক্ষ্য মানক করা ছিল @NonNull
এবং @Nullable
) বেশ কয়েক বছর ধরে সুপ্ত ছিল, তাই আমি ভয় পাচ্ছি যে এর উত্তম উত্তর নেই। আমরা যা করতে পারি তা হ'ল একটি ব্যবহারিক সমাধান খুঁজে বের করা এবং খনিটি নিম্নরূপ:
বাক্য গঠন
খাঁটি স্টাইলিস্টিক দৃষ্টিকোণ থেকে আমি নিজে জাভা বাদে আইডিই, কাঠামো বা কোনও সরঞ্জামকিটের কোনও উল্লেখ এড়াতে চাই।
এটি বাতিল করে দেয়:
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
। প্রাক্তন জেইই নিয়ে আসে। এটি যদি এর চেয়ে ভাল হয় javax.annotation
, যা শেষ পর্যন্ত জেএসই নিয়ে আসতে পারে বা কখনই নয়, এটি বিতর্কের বিষয়। আমি ব্যক্তিগতভাবে পছন্দ করি javax.annotation
কারণ আমি জেইই নির্ভরতা পছন্দ করি না।
এটি আমাদের সাথে ছেড়ে যায়
javax.annotation
এটিও সবচেয়ে ছোট is
শুধুমাত্র এক সিনট্যাক্স এমনকি ভাল হবে হল: 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)
)।
যেমনটি এই বর্ণনায় বর্ণিত হয়েছে রানটাইম টীকাগুলির প্রভাব যেটি মনে করতে পারে তার চেয়ে কম তবে তাদের সংকলনের সময়কালের পাশাপাশি রানটাইম চেক করার সরঞ্জামগুলি সক্ষম করার সুবিধা রয়েছে।
আরেকটি গুরুত্বপূর্ণ পার্থক্য নেই যেখানে কোডে টীকা ব্যবহার করা যাবে। দুটি ভিন্ন পন্থা আছে। কিছু প্যাকেজ জেএলএস 9.6.4.1 শৈলী প্রসঙ্গ ব্যবহার করে। নিম্নলিখিত সারণি একটি ওভারভিউ দেয়:
ফিল্ড মেথড প্যারামিটার লোকাল_ভিরিবল
android.support.annotation XXX
edu.umd.cs.findbugs.annotations XXXX
org.jetbrains.annotation XXXX
লম্বোক এক্সএক্সএক্সএক্স
জাভ্যাক্স.অডিয়ালিটি.কন্ট্র্রেটগুলি XXX
org.eclipse.jdt.annotation
, javax.annotation
এবং org.checkerframework.checker.nullness.qual
জেএলএস ৪.১১ এ সংজ্ঞায়িত প্রসঙ্গগুলি ব্যবহার করুন, যা আমার মতে এটি করার সঠিক উপায়।
এটি আমাদের সাথে ছেড়ে যায়
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
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
( জেএসআর -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