কোন @ নটনুল জাভা টিকাটি আমার ব্যবহার করা উচিত?


997

আমি আমার কোডটিকে আরও পঠনযোগ্য করে তুলতে চাইছি পাশাপাশি নুলপয়েন্টারএক্সেপশনগুলি এড়াতে আইডিই কোড পরিদর্শন এবং / অথবা স্ট্যাটিক কোড বিশ্লেষণ (ফাইন্ডব্যাগস এবং সোনার) এর মতো সরঞ্জামাদি ব্যবহার করতে চাই। সরঞ্জামগুলির মধ্যে অনেকগুলি একে অপরের সাথে @NotNull/ @NonNull/ @Nonnullটীকাগুলির সাথে বেমানান বলে মনে হয় এবং সেগুলি আমার কোডে তালিকাভুক্ত করা পড়ার জন্য ভয়ানক। 'সেরা' কোনটির কোনও পরামর্শ? এখানে পাওয়া সমমানের টীকাগুলির তালিকা এখানে রয়েছে:

  • javax.validation.constraints.NotNull
    স্থির বিশ্লেষণ নয়, রানটাইম বৈধতার জন্য তৈরি।
    ডকুমেন্টেশন

  • edu.umd.cs.findbugs.annotations.NonNull
    দ্বারা ব্যবহৃত Findbugs স্ট্যাটিক বিশ্লেষণ এবং সেইজন্য সোনার (বর্তমানে Sonarqube )
    ডকুমেন্টেশন

  • javax.annotation.Nonnull
    এটি ফাইন্ডব্যাগগুলির সাথেও কাজ করতে পারে তবে জেএসআর -305 নিষ্ক্রিয়। (আরও দেখুন: জেএসআর 305 এর স্থিতি কী? ) উত্স ?

  • org.jetbrains.annotations.NotNull
    স্থির বিশ্লেষণের জন্য ইন্টেলিজ আইডিইএ আইডিই ব্যবহার করে।
    ডকুমেন্টেশন

  • lombok.NonNull
    প্রকল্প লম্বোকে কোড জেনারেশন নিয়ন্ত্রণ করতে ব্যবহৃত হয় ।
    কোনও স্ট্যান্ডার্ড না থাকায় স্থানধারক টীকা।
    উত্স , ডকুমেন্টেশন

  • android.support.annotation.NonNull
    সমর্থন-টীকা প্যাকেজ ডকুমেন্টেশন দ্বারা সরবরাহিত অ্যান্ড্রয়েডে চিহ্নিতকারী টিকা, উপলভ্য

  • org.eclipse.jdt.annotation.NonNull
    স্থিতিশীল কোড বিশ্লেষণ ডকুমেন্টেশনের জন্য Eclipse দ্বারা ব্যবহৃত


203
অ্যাপাচে একটি "সাধারণ" টিকা এবং এমন একটি সরঞ্জাম আবিষ্কার করা উচিত যা এটিকে অন্য কোনও টিকাতে রূপান্তর করতে পারে। অনেক স্ট্যান্ডার্ডের সমস্যার সমাধান হ'ল নতুন মান উদ্ভাবন করা।
অপরিবর্তনীয়

6
@irreputable যদি অ্যাপাচি একটি নতুন "সাধারণ" আবিষ্কার করে তবে এর 56 টি সংস্করণ থাকবে, অন্যান্য প্রকল্পের সাথে ওভারল্যাপ করে। এবং, এটি যাইহোক স্ট্যান্ডার্ড হবে না (স্ট্যান্ডার্ড! = বিস্তৃত)। সত্যিই স্ট্যান্ডার্ড, জাভ্যাক্স?। * ব্যবহার করে আরও ভাল ব্যবহার করা। বিটিডব্লিউ, এই উদাহরণগুলিতে "খুব বেশি মান" নেই, আমি কেবল 1 বা 2 দেখি
ymajoros

6
javax.annotation.Nonnull ফাইন্ডব্যাগগুলির সাথে কাজ করে (কেবল এটি পরীক্ষা করা হয়েছে), এটি আমার কাছে এটি ব্যবহারের জন্য বাধ্যতামূলক কারণ।
নিকোলাস সি

20
আমি যদি সহজভাবে @ নটনুল লিখি তবে এটি উল্লেখ করে com.sun.istack.internal.NotNull। ওএমজি ...
টমাস ওয়েলারের

3
@ মোজার্টব্রোচিনি - casesচ্ছিকগুলি সেই ক্ষেত্রে কার্যকর যেখানে আপনি আগে নুলঅবজেক্ট ব্যবহার করতে পারেন। তারা আসলে রানটাইম হিসাবে একই লক্ষ্যটিকে লক্ষ্য করে না \ @ নটনুল টীকা যদিও না, এবং তারা ক্লান্তিকর মোড়কির প্রবর্তন করে।
ডেভ

উত্তর:


205

যেহেতু জেএসআর 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
  • lomboklombokঅঙ্গীকার থেকেf6da35e4c4f3305ecd1b415e2ab1b9ef8a9120b4
  • javax.validation.constraints থেকে validation-api-1.0.0.GA-sources.jar

7
এর নেতিবাচক দিকটি javax.annotationহ'ল এটি একটি) একটি মৃত জেএসআর এর উপর ভিত্তি করে, খ) এমন একটি শৈল্পিক সন্ধান পাওয়া শক্ত যা কেবল টীকা সরবরাহ করে এবং বজায় থাকে। ফাইন্ডব্যাগগুলির মধ্যে একটিটি হ'ল: search.maven.org/…
রবিনস্ট

18
এর বিপরীতে আরেকটি বিষয় javax.annotationহ'ল এটি জাভা 9 নিয়ে সমস্যা সৃষ্টি করে কারণ অন্যান্য মডিউলগুলিও সেই প্যাকেজে ক্লাস সরবরাহ করে (জ্যাক্স-ডাব্লু)।
রবিবিনস্ট

10
@ কেভিনার্প: ফাইন্ডব্যাগস প্রকল্পটি মারা গেছে, এবং উত্তরসূরি প্রকল্প স্পটব্যাগস সেই টীকাগুলি সরিয়ে ফেলছে: github.com/spotbugs/spotbugs/pull/180
রবিনস্ট

4
জেএসআর 305 , যা মানক করা হত javax.annotation.NonNull, কখনই সম্পন্ন হয়নি কারণ এর নির্দিষ্ট লিড অ্যাডব্লিউএল গেছে। ওরাকলের কোনও সিদ্ধান্তের সাথে এর কোনও যোগসূত্র ছিল না।
মার্ক রিইনহোল্ড

5
ব্যবহার না করার আরেকটি কারণ jsr305.jar যে এটা দৃশ্যত ওরাকল জাভা বাইনারি লাইসেন্স লঙ্ঘন: github.com/google/guava/issues/2960
ফ্লো

91

আমি চেকার ফ্রেমওয়ার্কটি খুব পছন্দ করি , যা প্রকার টীকাগুলির ( JSR-308 ) একটি বাস্তবায়ন যা একটি শূন্যতা পরীক্ষকের মতো ত্রুটিযুক্ত চেকারগুলি প্রয়োগ করতে ব্যবহৃত হয়। আমি সত্যিই অন্য কোনও তুলনামূলক প্রস্তাব দেওয়ার চেষ্টা করি নি, তবে আমি এই বাস্তবায়নে খুশি হয়েছি।

সফটওয়্যারটি সরবরাহ করে এমন গোষ্ঠীর সাথে আমি যুক্ত নই, তবে আমি একজন অনুরাগী।

এই ব্যবস্থা সম্পর্কে আমি চারটি জিনিস পছন্দ করি:

  1. এটি শালীনতার জন্য একটি ত্রুটিযুক্ত চেকার রয়েছে (@ নুলাব্য), তবে অপরিবর্তনীয়তা এবং ইন্টার্নিংয়ের (এবং অন্যদের) জন্যও রয়েছে । আমি প্রথমটি ব্যবহার করব (নালীনতা) এবং আমি দ্বিতীয়টি ব্যবহার করার চেষ্টা করছি (অপরিবর্তনীয়তা / আইজিজে)। আমি তৃতীয়টি চেষ্টা করে দেখছি, তবে এটি দীর্ঘমেয়াদী ব্যবহারের বিষয়ে আমি এখনও নিশ্চিত নই। আমি এখনও অন্য চেকারগুলির সাধারণ উপযোগিতার বিষয়ে নিশ্চিত নই, তবে এটি জেনে ভাল লাগল যে কাঠামোটি নিজেই বিভিন্ন অতিরিক্ত টিকাদান এবং চেকারগুলি বাস্তবায়নের জন্য একটি ব্যবস্থা।

  2. Nullness পরীক্ষণের জন্য ডিফল্ট সেটিং স্থানীয়দের (NNEL) ব্যতীত অ নাল: ভাল কাজ করে। মূলত এর অর্থ হ'ল ডিফল্টরূপে চেকার স্থানীয় ভেরিয়েবল ব্যতীত প্রত্যেকটি (উদাহরণস্বরূপ ভেরিয়েবল, পদ্ধতি পরামিতি, জেনেরিক ধরণের ইত্যাদি) আচরণ করে যেমন তাদের ডিফল্টরূপে @ নননুল টাইপ রয়েছে। ডকুমেন্টেশন প্রতি:

    এনএনইএল ডিফল্ট আপনার কোডে স্বল্প টীকাতে স্বল্প সংখ্যার দিকে নিয়ে যায়।

    কোনও ক্লাসের জন্য বা কোনও পদ্ধতির জন্য এনএনএল আপনার পক্ষে কাজ না করে আপনি আলাদা ডিফল্ট সেট করতে পারেন।

  3. এই ফ্রেমওয়ার্কটি আপনাকে মন্তব্যটিতে আপনার টীকাগুলি সংযুক্ত করে ফ্রেমওয়ার্কের উপর নির্ভরতা তৈরি না করে ব্যবহার করতে দেয় : উদাহরণস্বরূপ /*@Nullable*/। এটি দুর্দান্ত কারণ আপনি একটি লাইব্রেরি বা ভাগ করা কোডটি টিকিয়ে দিতে এবং পরীক্ষা করতে পারেন, তবে এখনও ফ্রেমওয়ার্কটি ব্যবহার না করে এমন কোনও লাইব্রেরি / শেয়ারড কোডড ব্যবহার করতে পারবেন। এটি একটি দুর্দান্ত বৈশিষ্ট্য। আমি এখন এটি আমার সমস্ত প্রকল্পে চেকার ফ্রেমওয়ার্ক সক্ষম করার ঝোঁক সত্ত্বেও এটি ব্যবহারে অভ্যস্ত হয়ে উঠছি।

  4. ফ্রেমওয়ার্কটিতে আপনার ব্যবহৃত API গুলি টীকা টানানোর একটি উপায় রয়েছে যা স্টাব ফাইলগুলি ব্যবহার করে ইতোমধ্যে শালীনতার জন্য বর্ণিত হয়নি।


3
দুর্দান্ত মনে হচ্ছে এবং আমি এটি ব্যবহার করতে চাই, তবে পারব না। জিপিএল কেন? পরিবর্তে এটি এলজিপিএল হতে পারে না?
বুখার্ড

13
এফএকিউ অনুসারে : "আরও অনুমতিপ্রাপ্ত এমআইটি লাইসেন্স এমন কোডের ক্ষেত্রে প্রযোজ্য যা আপনি নিজের প্রোগ্রামে অন্তর্ভুক্ত করতে চাইতে পারেন, যেমন টীকাগুলি।"
seanf

1
লিঙ্কগুলি বর্তমানে নষ্ট হয়ে গেছে। তবে চেকার ফ্রেমওয়ার্ক ব্যবহারের পরামর্শের জন্য +1 করুন।
পল ওয়াগল্যান্ড

1
এটি অত্যন্ত দুঃখের বিষয় যে সর্বশেষ প্রকাশে অপরিবর্তনীয়তা যাচাইকারীদের বাদ দেওয়া হয়েছে।
ফ্র্যাঙ্কলিন ইউ

1
ওরাকল জাভা টিউটোরিয়ালগুলিতে চেকার ফ্রেমওয়ার্কও প্রস্তাবিত ।
কাজী ইরফান

55

আমি ইন্টেলিজ ব্যবহার করি, কারণ আমি বেশিরভাগই ইন্টেলিজজে ফ্ল্যাগিং জিনিসগুলির সাথে উদ্বিগ্ন যা কোনও এনপিই উত্পাদন করতে পারে। আমি সম্মত হই যে জেডিকে মানক টিকা নেই frust এটি যুক্ত করার কথা রয়েছে, এটি এটি জাভা into-এ পরিণত করতে পারে which এক্ষেত্রে বেছে নিতে আরও একজনকে থাকতে হবে!


68
আপডেট: ইনটেলিজ এখন কোড হাইলাইট করার জন্য উপরের সমস্ত টীকাগুলিকে সমর্থন করে, সুতরাং আপনি আর ইন্টেলিজের টীকাতে
ড্যানিয়েল আলেকিয়াক

31
আর তাই গ্রহন করে জুনো!
jFrenetic

5
javax.annotation.Nonnullআরও ব্যাপকভাবে গৃহীত হয়, তাই না?
মার্টিন

1
@ ড্যানিয়েল অ্যালেক্সিয়ুক তবে দুর্ভাগ্যক্রমে, এটি তাদের রানটাইম চেকগুলির জন্য ব্যবহার করে না, তাই জেটব্রেইনগুলি ব্যবহার করার এখনও একটি উপকার রয়েছে ...
ট্রেজকাজ

4
@ ট্রেজকাজ ২০১.3.৩০ থেকে এটি সবার জন্য রানটাইম চেক তৈরি করে।
করোল এস

32

মতে জাভা 7 বৈশিষ্ট্য তালিকা JSR-308 টাইপ টীকা জাভা 8. JSR-305 টীকা থেকে পিছিয়ে করা থাকলেও সেগুলিকে উল্লেখ নেই।

সর্বশেষ জেএসআর -308 খসড়ার একটি পরিশিষ্টে জেএসআর -305 রাজ্যের সম্পর্কে কিছুটা তথ্য রয়েছে । এটিতে জেএসআর -305 টীকাটি পরিত্যাগ করা বলে মনে হচ্ছে এমন পর্যবেক্ষণ অন্তর্ভুক্ত করে। জেএসআর -305 পৃষ্ঠা এটিকে "নিষ্ক্রিয়" হিসাবে দেখায়।

মাঝামাঝি সময়ে, ব্যবহারিক উত্তরটি হ'ল এনটোটেশন প্রকারগুলি যা সর্বাধিক ব্যবহৃত সরঞ্জামগুলির দ্বারা সমর্থিত ... এবং পরিস্থিতি পরিবর্তিত হলে সেগুলি পরিবর্তন করতে প্রস্তুত থাকুন।


প্রকৃতপক্ষে, জেএসআর -308 কোনও টীকা জাতীয় ধরণ / শ্রেণি সংজ্ঞায়িত করে না এবং দেখে মনে হয় যে তারা মনে করে এটি এটার আওতার বাইরে। (এবং তারা ঠিক আছে, জেএসআর -305 এর অস্তিত্বের দিক দিয়ে)।

তবে, যদি জেএসআর -308 সত্যিই এটি জাভা 8-তে পরিণত করার মতো দেখায়, জেএসআর -305 এর প্রতি আগ্রহ পুনরুদ্ধারিত হয় তবে তা আমাকে অবাক করে না। আফাইক, জেএসআর -305 দল আনুষ্ঠানিকভাবে তাদের কাজটি ত্যাগ করেনি। তারা মাত্র 2+ বছর ধরে চুপচাপ রয়েছে।

এটি আকর্ষণীয় যে বিল ফাগ (জেএসআর -305 এর জন্য প্রযুক্তিগত নেতৃত্ব) ফাইন্ডব্যাগগুলির পিছনে থাকা এক ব্যক্তির।


4
@pst - বর্তমান সময়সূচী জাভা 8 এর সেপ্টেম্বর 2013 এ সাধারণ প্রকাশে যাওয়ার জন্য রয়েছে - infoq.com/news/2012/04/jdk-8-milestone-release-dates
স্টিফেন সি

2
এটি এখন মার্চ ২০১৪ এ পিছলে গেছে - openjdk.java.net/projects/jdk8 । জেএসআর 308 বিল্ড এম 7 ("104 - জাভা টাইপগুলিতে টিকা" দেখুন) এর অন্তর্ভুক্ত।
স্টিফেন সি

28

অ্যান্ড্রয়েড প্রকল্পগুলির জন্য আপনি ব্যবহার করা উচিত android.support.annotation.NonNullএবং android.support.annotation.Nullable। এই এবং অন্যান্য সহায়ক অ্যান্ড্রয়েড-ভিত্তিক টীকা পাওয়া যায় সাপোর্ট লাইব্রেরী

Http://tools.android.com/tech-docs/support-Anotations থেকে :

সমর্থন লাইব্রেরি নিজেই এই টীকাগুলির সাথেও টীকায়িত হয়েছে, তাই সমর্থন লাইব্রেরির ব্যবহারকারী হিসাবে, অ্যান্ড্রয়েড স্টুডিও ইতিমধ্যে আপনার কোডগুলি চিহ্নিত করে এবং এই টিকাগুলির উপর ভিত্তি করে সম্ভাব্য সমস্যাগুলি চিহ্নিত করবে।


3
এই সুপারিশের ন্যায্যতা সরবরাহ করা কার্যকর হবে।
এপ্রিকট

2
"" সমর্থন লাইব্রেরি নিজেই এই টীকাগুলির সাথেও টীকায়িত হয়েছে, সুতরাং সমর্থন লাইব্রেরির ব্যবহারকারী হিসাবে, অ্যান্ড্রয়েড স্টুডিও ইতিমধ্যে আপনার কোডগুলি পরীক্ষা করবে এবং এই টীকাগুলির উপর ভিত্তি করে সম্ভাব্য সমস্যা চিহ্নিত করবে । "
জেমস ওয়াল্ড

3
বিটিডাব্লু অ্যান্ড্রয়েড স্টুডিওও জেনার 305 সমর্থন করে javax.annotation.*টীকা সহ
ক্যামব্যাপ

19

যদি কেউ কেবল ইন্টেলিজ ক্লাসের সন্ধান করে থাকে: আপনি সেগুলি মভেন স্টোরের সাথে এগুলি পেতে পারেন

<dependency>
    <groupId>org.jetbrains</groupId>
    <artifactId>annotations</artifactId>
    <version>15.0</version>
</dependency> 

হ্যাঁ, এটি হ'ল ইনটেলিজ হুঁশিয়ারি উচ্চারণ করে, হ্যাঁ।
9

বর্তমান সংস্করণ (05/2017 হিসাবে) 15.0
বামাপুকি

আপনার অধিকার. আমি সংস্করণ আপডেট করেছি। এমনকি যদি আমি অনুমান করি তবে এটি খুব বেশি পরিবর্তন হয়নি।
ব্রুনো এবারহার্ড

মনে রাখবেন যে জেটব্রেইন টীকাগুলি রানটাইমের জন্য ধরে রাখা যায় না, সুতরাং গুয়াসের @ নুলাবল সমর্থন এটির সাথে কাজ করে না।
পিটার মেজর

18

জেএসআর 305 এবং ফাইন্ডব্যাগগুলি একই ব্যক্তি দ্বারা রচিত। উভয়ই দুর্বল রক্ষণাবেক্ষণ করা হয় তবে এটি যতটা স্ট্যান্ডার্ড হয় ততই বড় আইডিই সমর্থন করে by সুসংবাদটি হ'ল তারা যথাযথভাবে কাজ করে।

ডিফল্টরূপে সমস্ত শ্রেণি, পদ্ধতি এবং ক্ষেত্রগুলিতে @ নননলকে কীভাবে প্রয়োগ করতে হবে তা এখানে। দেখুন https://stackoverflow.com/a/13319541/14731 এবং https://stackoverflow.com/a/9256595/14731

  1. নির্ধারণ করা @NotNullByDefault
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.annotation.Nonnull;
import javax.annotation.meta.TypeQualifierDefault;


    /**
     * This annotation can be applied to a package, class or method to indicate that the class fields,
     * method return types and parameters in that element are not null by default unless there is: <ul>
     * <li>An explicit nullness annotation <li>The method overrides a method in a superclass (in which
     * case the annotation of the corresponding parameter in the superclass applies) <li> there is a
     * default parameter annotation applied to a more tightly nested element. </ul>
     * <p/>
     * @see https://stackoverflow.com/a/9256595/14731
     */
    @Documented
    @Nonnull
    @TypeQualifierDefault(
    {
        ElementType.ANNOTATION_TYPE,
        ElementType.CONSTRUCTOR,
        ElementType.FIELD,
        ElementType.LOCAL_VARIABLE,
        ElementType.METHOD,
        ElementType.PACKAGE,
        ElementType.PARAMETER,
        ElementType.TYPE
    })
    @Retention(RetentionPolicy.RUNTIME)
    public @interface NotNullByDefault
    {
    }

২. প্রতিটি প্যাকেজে টীকা যুক্ত করুন: package-info.java

@NotNullByDefault
package com.example.foo;

আপডেট : 12 ডিসেম্বর, 2012 হিসাবে জেএসআর 305 "সুপ্ত" হিসাবে তালিকাভুক্ত। ডকুমেন্টেশন অনুযায়ী:

একটি জেএসআর যা নির্বাহী কমিটি দ্বারা "সুপ্ত" হিসাবে ভোট পেয়েছিল বা তার প্রাকৃতিক জীবনকাল শেষের দিকে পৌঁছেছে।

দেখে মনে হচ্ছে JSR 308 হয় JDK 8 সেটিকে উপার্জন এবং যদিও JSR @NotNull সংজ্ঞায়িত নয়, সহগামী Checkers Frameworkনা। এই লেখার সময়, মাগন প্লাগইনটি এই বাগের কারণে অকার্যকর: https://github.com/typetools/checker-framework/issues/183


2
মাভেনের শোস্টোপার ইস্যুটি ঠিক করা হয়েছে। সুতরাং এটি আবার একটি বিকল্প হওয়া উচিত।
মার্ক ভন রেন্টেলেন

আমি ম্যাভেনের মাধ্যমে ফাইন্ডব্যাগগুলি ব্যবহার করি, আমার আইডিই দ্বারা কিছুই করা হয় না, এটি আইডিই নির্দিষ্ট টীকাগুলি এড়িয়ে যায়, আপনি কী সুপারিশ করবেন?
ক্রিস্টোফ রাউসি

@ ক্রিস্টোফেরউসি আপনার প্রশ্নটি আইডিই-নির্দিষ্ট। দয়া করে একটি পৃথক প্রশ্ন খুলুন।
গিলি

15

স্থির বিশ্লেষণ এবং রানটাইম বিশ্লেষণের মধ্যে পার্থক্য করুন। অভ্যন্তরীণ স্টাফের জন্য স্থির বিশ্লেষণ, এবং আপনার কোডের সার্বজনীন সীমানার জন্য রানটাইম বিশ্লেষণ ব্যবহার করুন।

যে জিনিসগুলি বাতিল হবে না তার জন্য:

  • রানটাইম চেক করুন: "যদি (x == নাল) ..." (শূন্য নির্ভরতা) বা @ জাভ্যাক্স.ওলিয়েশন.নোট নল (বিনের বৈধতা সহ) বা @ লম্বোক.নন নল (সরল এবং সাধারণ) বা গুয়াসা প্রাক-শর্তাবলী। ।)

    • পদ্ধতির রিটার্ন ধরণের (কেবল) জন্য ptionচ্ছিক ব্যবহার করুন। হয় জাভা 8 বা পেয়ারা।
  • স্থির চেক: একটি @ নন টিকা ব্যবহার করুন

  • এটি যেখানে মানানসই, সেখানে @ ব্যবহার করুন ... ক্লাস বা প্যাকেজ স্তরে নননলবাইডিফল্ট টিকা। এই টিকাগুলি নিজে তৈরি করুন (উদাহরণগুলি খুঁজে পাওয়া সহজ)।
    • অন্যথায়, @ ব্যবহার করুন ... এনপিইগুলি এড়াতে পদ্ধতিতে ফেরত যাচাই করুন;

এটির সর্বোত্তম ফলাফলটি দেওয়া উচিত: আইডিই-তে সতর্কতা, ফাইন্ডব্যাগস এবং চেকস্প্রেমওয়ার্ক দ্বারা ত্রুটিগুলি, অর্থপূর্ণ রানটাইম ব্যতিক্রম।

স্থির চেকগুলি পরিপক্ক হওয়ার আশা করবেন না, তাদের নামকরণটি প্রমিত হয় না এবং বিভিন্ন গ্রন্থাগার এবং আইডিইগুলি তাদের সাথে আলাদা আচরণ করে, এড়িয়ে চলে। JSR305 javax.annotations। * ক্লাসগুলি স্ট্যান্ডার্ডের মতো দেখায় তবে সেগুলি হয় না এবং এটি জাভা 9 + এর সাথে বিভক্ত প্যাকেজ সৃষ্টি করে।

কিছু নোটের ব্যাখ্যা:

  • প্যাকেজ জাভ্যাক্স.যুক্তকরণের সাথে ফাইন্ডব্যাগস / স্পটব্যাগস / জেএসআর 305 টিকা। * জাভা 9 + এ অন্যান্য মডিউলগুলির সাথে সংঘর্ষ, সম্ভবত ওরাকল লাইসেন্স লঙ্ঘন
  • স্পটব্যাগ টীকাগুলি এখনও jsr305 / findbugs টীকা সংকলনের সময় উপর নির্ভর করে ( https://github.com/spotbugs/spotbugs/issues/421 লেখার সময় )
  • জেটব্রেইনস @ নটনুল নামের @ জাভ্যাক্স.অলয়েডেশন.নোটনুলের সাথে দ্বন্দ্ব রয়েছে।
  • স্থির চেকিংয়ের জন্য জেটব্রেন, গ্রিপস বা চেকার্স ফ্রেমওয়ার্ক টীকাগুলির জাভাক্স.অনোটেশনগুলির চেয়ে সুবিধা রয়েছে যে তারা জাভা 9 এবং উচ্চতর অন্যান্য মডিউলগুলির সাথে সংঘর্ষে নয় not
  • @ জাভ্যাক্স.অনোটেশনস.নুলিয়েবল মানে আপনি (বা আপনার আইডিই) এর অর্থ কী তা খুঁজে বের করার অর্থ / স্পটব্যাগগুলি বোঝায় না। ফাইন্ডব্যাগগুলি এটিকে (সদস্যদের) উপেক্ষা করবে। দুঃখজনক হলেও সত্য ( https://sourceforge.net/p/findbugs/bugs/1181 )
  • কোনও আইডিইর বাইরে স্থির চেক করার জন্য, 2 টি বিনামূল্যে সরঞ্জাম বিদ্যমান: স্পটব্যাগস (পূর্বে ফাইন্ডব্যাগস) এবং চেকারস ফ্রেমওয়ার্ক।
  • এক্সিলিপস লাইব্রেরিতে @ নননলবিডিডফল্ট রয়েছে, জেএসআর 305-তে কেবলমাত্র @PraimarAreNonnullByDefault রয়েছে। এগুলি কেবল প্যাকেজ (বা শ্রেণি) এর প্রত্যেকটিতে বেস টীকাগুলি প্রয়োগ করার সুবিধাযুক্ত মোড়ক, আপনি সহজেই নিজের তৈরি করতে পারেন। এটি প্যাকেজে ব্যবহার করা যেতে পারে। এটি উত্পন্ন কোড (যেমন লম্বোক) সাথে দ্বন্দ্ব করতে পারে।
  • লম্বোককে রফতানি নির্ভরতা হিসাবে ব্যবহার করা লাইব্রেরিগুলির জন্য এড়ানো উচিত যা আপনি অন্যান্য লোকের সাথে ভাগ করেন, কম ট্রানসিটিভ নির্ভরতা আরও ভাল
  • বিনের বৈধতা ফ্রেমওয়ার্কটি ব্যবহার করা শক্তিশালী, তবে উচ্চ ওভারহেডের প্রয়োজন হয়, সুতরাং ম্যানুয়াল নাল পরীক্ষা করা এড়াতে ওভারকিল।
  • ক্ষেত্র এবং পদ্ধতির পরামিতিগুলির জন্য ptionচ্ছিক ব্যবহার বিতর্কিত (আপনি সহজেই এটি সম্পর্কে নিবন্ধগুলি সন্ধান করতে পারেন)
  • অ্যান্ড্রয়েড নাল টীকাগুলি অ্যান্ড্রয়েড সমর্থন লাইব্রেরির অংশ, এগুলি সম্পূর্ণ অন্যান্য ক্লাসের সাথে আসে এবং অন্যান্য টীকাগুলি / সরঞ্জামগুলির সাথে সুন্দরভাবে খেল না don't

জাভা 9 এর আগে, এটি আমার প্রস্তাব:

// file: package-info.java
@javax.annotation.ParametersAreNonnullByDefault
package example;


// file: PublicApi
package example;

public interface PublicApi {

    Person createPerson(
        // NonNull by default due to package-info.java above
        String firstname,
        String lastname);
}

// file: PublicApiImpl
public class PublicApiImpl implements PublicApi {
    public Person createPerson(
            // In Impl, handle cases where library users still pass null
            @Nullable String firstname, // Users  might send null
            @Nullable String lastname // Users might send null
            ) {
        if (firstname == null) throw new IllagalArgumentException(...);
        if (lastname == null) throw new IllagalArgumentException(...);
        return doCreatePerson(fistname, lastname, nickname);
    }

    @NonNull // Spotbugs checks that method cannot return null
    private Person doCreatePerson(
             String firstname, // Spotbugs checks null cannot be passed, because package has ParametersAreNonnullByDefault
             String lastname,
             @Nullable String nickname // tell Spotbugs null is ok
             ) {
         return new Person(firstname, lastname, nickname);
    }

    @CheckForNull // Do not use @Nullable here, Spotbugs will ignore it, though IDEs respect it
    private Person getNickname(
         String firstname,
         String lastname) {
         return NICKNAMES.get(firstname + ':' + lastname);
    }
}

নোট করুন যে যখন কোনও শূন্য পদ্ধতিতে পরামিতিটি অবজ্ঞাপূর্ণ হয় (লেখার সময়, স্পটব্যাগগুলির সংস্করণ 3.1) তখন স্পটব্যাগগুলি একটি সতর্কতা বাড়ানোর কোনও উপায় নেই। হতে পারে চেকস্প্রেমওয়ার্ক এটি করতে পারে।

দুর্ভাগ্যক্রমে এই টীকাগুলি স্বেচ্ছাসেবী কলসাইট সহ গ্রন্থাগারের পাবলিক পদ্ধতির ক্ষেত্রে এবং প্রতিটি কলসাইটটি পরিচিত হতে পারে এমন নন-পাবলিক পদ্ধতিগুলির মধ্যে পার্থক্য করে না। সুতরাং এর দ্বিগুণ অর্থ: "ইঙ্গিত করুন যে নালটি অনাকাঙ্ক্ষিত, তবে তবুও নাল পাস করার জন্য প্রস্তুত করুন" একটি একক ঘোষণায় সম্ভব নয়, সুতরাং উপরোক্ত উদাহরণটির ইন্টারফেস এবং বাস্তবায়নের জন্য বিভিন্ন টীকা রয়েছে।

যে ক্ষেত্রে বিভক্ত ইন্টারফেস পদ্ধতির ব্যবহারিক নয়, নিম্নলিখিত পদ্ধতির একটি আপস:

        public Person createPerson(
                @NonNull String firstname,
                @NonNull String lastname
                ) {
            // even though parameters annotated as NonNull, library clients might call with null.
            if (firstname == null) throw new IllagalArgumentException(...);
            if (lastname == null) throw new IllagalArgumentException(...);
            return doCreatePerson(fistname, lastname, nickname);
        }

এটি ক্লায়েন্টদের যদি কার্যকর ত্রুটিগুলি করে থাকে তবে তাদের শূন্য (সঠিক কোড লেখার) পাস না করতে সহায়তা করে।


আমি এখনই এই উত্তরটি খুঁজে পেয়েছি, তবে @ টক্রুজ, আপনি কোথায় এটি পেয়েছেন: "অচলিত জেডিটি টীকাগুলি স্থির পদ্ধতি রিটার্ন এবং কিছু অন্যান্য ক্ষেত্রে প্রযোজ্য নয়"? (প্রথম অংশটি সত্য নয়, দ্বিতীয়টি বেশ অস্পষ্ট :))।
স্টিফান হারমান n

@ স্টাফেন হারম্যান: আমি মনে করতে পারি না। আমি বুলেট পয়েন্ট সরিয়েছি।
tkruse

12

গ্রহণের নিজস্ব টীকাও রয়েছে।

org.eclipse.jdt.annotation.NonNull

বিশদ জানতে http://wiki.eclipse.org/JDT_Core/ নাল_অ্যানালাইসিস দেখুন ।


দেখে মনে হচ্ছে এটি Eclipse 3.8 (জুনো) থেকে একীভূত হতে চলেছে যা এই ক্ষেত্রে ইন্টেলিজির সাথে Eclipse-in-Line আনবে। এছাড়াও এটি আপনাকে নিজের নাল টীকাগুলি (যেমন javax.annotation.Nonnull) কনফিগার করার অনুমতি দেয় এবং নটনুলের ডিফল্ট হওয়ার বিকল্প রয়েছে।
মোটি স্টর্ম

11

কেবল ইঙ্গিত করে যে জাভা বৈধকরণ এপিআই ( javax.validation.constraints.*) কোনও @Nullableটিকা নিয়ে আসে না , যা স্থির বিশ্লেষণ প্রসঙ্গে খুব মূল্যবান। এটি রানটাইম বিনের বৈধতার জন্য অর্থবোধ করে কারণ এটি জাভাতে কোনও অ-আদিম ক্ষেত্রের (যেমন বৈধকরণ / প্রয়োগের জন্য কিছুই নয়) ডিফল্ট। উদ্দেশ্যে বলা হয়েছে যে বিকল্পগুলির দিকে ওজন করা উচিত।


7

দুর্ভাগ্যক্রমে, JSR 308এখানে এই প্রকল্প স্থানীয় নয় নাল পরামর্শের চেয়ে বেশি মান যুক্ত করবে না

Java 8একটি একক ডিফল্ট টিকা বা তার নিজস্ব Checkerকাঠামো নিয়ে আসবে না । JSR 305ফাইন্ড -বাগের মতো বা এই জেএসআর বেশিরভাগ একাডেমিক টিমের একটি ছোট্ট দল দ্বারা দুর্বল রক্ষণাবেক্ষণ করা হয়।

এর পেছনে কোন বাণিজ্যিক শক্তি, এইভাবে JSR 308লঞ্চ EDR 3(প্রারম্ভিক সময়ে খসড়া পর্যালোচনা JCP) এখন, যখন Java 8-O অনুরূপ: কম 6 মাসে অর্ণবপোত অনুমিত হয় 310BTW। তবে 308 Oracleজাভা প্ল্যাটফর্মের ক্ষতির পরিমাণ কমিয়ে আনার জন্য এখন এটির প্রতিষ্ঠাতা থেকে দূরে থাকা দায়ভার গ্রহণ করেছে unlike

প্রতিটি প্রকল্প, বিক্রেতা এবং একাডেমিক ক্লাস পেছনের মতো পছন্দ করে Checker Frameworkএবং JSR 308নিজস্ব মালিকানা যাচাইকারী টীকা তৈরি করবে।

, বছর ধরে সোর্স কোড বেমানান মেকিং পর্যন্ত কয়েক জনপ্রিয় আপোস পাওয়া যায়নি এবং হয়ত যোগ করা Java 9বা 10বা এগুলির মতো অবকাঠামো মাধ্যমে Apache Commonsবা Google Guava;-)


7

অ্যান্ড্রয়েড

এই উত্তরটি অ্যান্ড্রয়েড নির্দিষ্ট। অ্যান্ড্রয়েড সমর্থিত প্যাকেজ কল আছে support-annotations। এই উপলব্ধ ডজন এর অ্যান্ড্রয়েড নির্দিষ্ট টীকা এবং উপলব্ধ সাধারণ বেশী মত NonNull, Nullableইত্যাদি

যোগ করার জন্য সমর্থন-টীকা প্যাকেজ, আপনার build.gradle নিম্নলিখিত নির্ভরতা যোগ করুন:

compile 'com.android.support:support-annotations:23.1.1'

এবং তারপরে ব্যবহার করুন:

import android.support.annotation.NonNull;

void foobar(@NonNull Foo bar) {}

5

এটি প্রবাহিত (জাভা 8?) সাজানোর জন্য অপেক্ষা করার সময়, আপনি কেবল নিজের প্রকল্প-স্থানীয় @NotNullএবং @Nullableটীকা সংজ্ঞায়িত করতে পারেন । আপনি জাভা এসই এর সাথে কাজ করছেন এমন ক্ষেত্রেও এটি কার্যকর হতে পারে যেখানে ডিফল্টরূপে javax.validation.constraints উপলব্ধ নেই

import java.lang.annotation.*;

/**
 * Designates that a field, return value, argument, or variable is
 * guaranteed to be non-null.
 */
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE})
@Documented
@Retention(RetentionPolicy.CLASS)
public @interface NotNull {}

/**
 * Designates that a field, return value, argument, or variable may be null.
 */
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE})
@Documented
@Retention(RetentionPolicy.CLASS)
public @interface Nullable {}

এটি স্বীকৃতভাবে মূলত আলংকারিক বা ভবিষ্যত-প্রমাণীকরণের উদ্দেশ্যেই হবে, কারণ উপরোক্ত স্পষ্টতই এই টীকাগুলির স্থির বিশ্লেষণের জন্য কোনও সমর্থন যোগ করে না।


4

যদি আপনি অ্যান্ড্রয়েডের জন্য বিকাশ করছেন তবে আপনি কিছুটা গ্রহণের সাথে আবদ্ধ (সম্পাদনা করুন: লেখার সময়, আর নয়), যার নিজস্ব মন্তব্য রয়েছে। এটি Eclipse 3.8+ (জুনো) এর অন্তর্ভুক্ত, তবে ডিফল্টরূপে অক্ষম।

আপনি এটিকে অগ্রাধিকার> জাভা> সংকলক> ত্রুটি / সতর্কতা> নাল বিশ্লেষণ (নীচে সংযোগযোগ্য বিভাগ) এ সক্ষম করতে পারেন।

"টিকা-ভিত্তিক নাল বিশ্লেষণ সক্ষম করুন" পরীক্ষা করুন

http://wiki.eclipse.org/JDT_Core/Null_Analysis#Usage অ্যানালাইসিস# ব্যবহারের সেটিংসে সুপারিশ রয়েছে। তবে, যদি আপনার কর্মক্ষেত্রে বাহ্যিক প্রকল্পগুলি থাকে (ফেসবুক এসডিকে মতো) তবে তারা সেই প্রস্তাবগুলি পূরণ করতে পারে না এবং আপনি সম্ভবত প্রতিটি এসডিকে আপডেটগুলি ঠিক করতে চান না ;-)

আমি ব্যবহার করি:

  1. নাল পয়েন্টার অ্যাক্সেস: ত্রুটি
  2. নাল স্পেসিফিকেশন লঙ্ঘন: ত্রুটি (পয়েন্ট # 1 এর সাথে যুক্ত)
  3. সম্ভাব্য নাল পয়েন্টার অ্যাক্সেস: সতর্কতা (অন্যথায় ফেসবুক এসডিকে সতর্কতা থাকতে হবে)
  4. নাল টীকাগুলি এবং নাল অনুমানের মধ্যে বিরোধ: সতর্কতা (পয়েন্ট # 3 এর সাথে যুক্ত)

4
গ্রহের সাথে বাঁধা? সত্য না.
ডিসকো

1
@ ডেভিডকাউডেন ইন্টেলিজ আইডিইএ অ্যান্ড্রয়েড ডিভিজিংয়ের পক্ষে সমর্থন সহ আমি মনে করি, অ্যান্ড্রয়েড স্টুডিওর পরিচয় দেওয়ার কিছু সময় আগে এটি উপলব্ধ ছিল।
মার্টিও ব্রিডিস

@ মার্টিņšব্রিডিস হ্যাঁ, এটি সত্য। আমার মনে হয় আপনি বোঝানো @chaqke
ডিসকো

এটি লক্ষণীয় যে অ্যান্ড্রয়েড এবং ইন্টেলিজের পৃথক টীকাগুলি রয়েছে এবং জাভাতে সরকারী টীকাগুলি অন্তর্ভুক্ত না হওয়া পর্যন্ত সম্ভবত এটি সেভাবেই থাকবে। এগুলি গ্রহনের সাথে গ্রহটির টীকাগুলি ব্যবহারের জন্য নির্দেশাবলী।
চক্কে

এটি কখনও গ্রহণের সাথে বাঁধা হয়নি। আপনি চাইলে যে কোনও আইডিই ব্যবহার করতে পারেন।
ডেনিস্ক

4

আপনি যদি একটি বড় প্রকল্পে কাজ করছেন, আপনি নিজের @Nullable এবং / অথবা @NotNullটীকাগুলি তৈরি করা ভাল better

উদাহরণ স্বরূপ:

@java.lang.annotation.Documented
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS)
@java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD,
                              java.lang.annotation.ElementType.METHOD,    
                              java.lang.annotation.ElementType.PARAMETER,
                              java.lang.annotation.ElementType.LOCAL_VARIABLE})
public @interface Nullable 
{
}

আপনি যদি সঠিক ধরে রাখার নীতিটি ব্যবহার করেন , তবে টীকাগুলি রানটাইমে উপলব্ধ হবে না । দৃষ্টিকোণ থেকে, এটি কেবল একটি অভ্যন্তরীণ জিনিস।

যদিও এটি কোনও কঠোর বিজ্ঞান নয়, তবে আমি মনে করি এটির জন্য একটি অভ্যন্তরীণ শ্রেণি ব্যবহার করা সর্বাধিক বুদ্ধিমান ।

  • এটি একটি অভ্যন্তরীণ জিনিস। (কার্যকরী বা প্রযুক্তিগত প্রভাব নেই)
  • অনেক অনেক ব্যবহারের সাথে।
  • আইডিই ইন্টেলিজের মতো কাস্টম @Nullable/ @NotNullটীকা সমর্থন করে ।
  • বেশিরভাগ ফ্রেমওয়ার্কগুলি তাদের নিজস্ব অভ্যন্তরীণ সংস্করণও ব্যবহার করতে পছন্দ করে।

অতিরিক্ত প্রশ্ন (মন্তব্য দেখুন):

কীভাবে এটি ইন্টেলিজজে কনফিগার করবেন?

ইন্টেলিজের স্ট্যাটাস বারের নীচের ডানদিকে "পুলিশ অফিসার" ক্লিক করুন। এবং পপআপে "পরিদর্শন কনফিগার করুন" ক্লিক করুন। পরবর্তী ... টীকাগুলি কনফিগার করুন


1
আমি আপনার পরামর্শ চেষ্টা করেছিলাম, কিন্তুideavoid test(@NonNull String s) {}test(null);
ইউজার 1244932

3
@ user1244932 আপনি ইন্টেলিজ আইডিএ মানে? স্থির বিশ্লেষণের জন্য এটি ব্যবহারযোগ্য অ্যানোলিটেশন কনফিগার করতে পারেন। আমি ঠিক জানি না, তবে সেগুলির মধ্যে সংজ্ঞা দেওয়ার একটি জায়গা হ'ল "ফাইল> সেটিংস> বিল্ড, এক্সিকিউশন, ডিপ্লোয়মেন্ট> কম্পাইলার" এবং সেখানে একটি বোতাম রয়েছে "টীকাগুলি কনফিগার করুন ..."।
অ্যাডোরাথ

আপনি যদি এখনও এটি খুঁজছেন তবে @ ব্যবহারকারী 1244932 স্ক্রিনশটটি দেখুন।
বিভিডিবি

3

এখানে ইতিমধ্যে অনেকগুলি উত্তর রয়েছে, তবে (ক) এটি 2019, এবং এখনও কোনও "স্ট্যান্ডার্ড" Nullableএবং (খ) কোটলিনের কোনও উত্তর নেই।

কোটলিনের রেফারেন্সটি গুরুত্বপূর্ণ, কারণ কোটলিন জাভা দিয়ে 100% আন্তঃযোগযোগ্য এবং এটিতে একটি মূল নাল সুরক্ষা বৈশিষ্ট্য রয়েছে। জাভা লাইব্রেরিগুলিতে কল করার সময়, কোটলিন সরঞ্জামগুলিকে কোনও জাভা এপিআই গ্রহণ করে বা ফিরে আসতে পারে কিনা তা জানতে এই টীকাগুলির সুবিধা নিতে পারে null

যতদূর আমি জানি, Nullableকোটলিনের সাথে একমাত্র সামঞ্জস্যপূর্ণ প্যাকেজগুলি হ'ল org.jetbrains.annotationsএবং android.support.annotation(এখন)androidx.annotation )। পরবর্তীটি কেবল অ্যান্ড্রয়েডের সাথেই সামঞ্জস্যপূর্ণ তাই এটি অ অ্যান্ড্রয়েড জেভিএম / জাভা / কোটলিন প্রকল্পগুলিতে ব্যবহার করা যাবে না। তবে জেটব্রেইনস প্যাকেজটি সর্বত্র কাজ করে।

সুতরাং আপনি যদি জাভা প্যাকেজগুলি বিকাশ করেন যা অ্যান্ড্রয়েড এবং কোটলিনেও কাজ করা উচিত (এবং অ্যান্ড্রয়েড স্টুডিও এবং ইন্টেলিজ্যা সমর্থন করে) তবে আপনার সেরা পছন্দ সম্ভবত জেটব্রেইনস প্যাকেজ।

ম্যাভেন:

<dependency>
    <groupId>org.jetbrains</groupId>
    <artifactId>annotations-java5</artifactId>
    <version>15.0</version>
</dependency>

Gradle:

implementation 'org.jetbrains:annotations-java5:15.0'

2
হুম, এটি অন্যথায় বলে: কোটলিংলং.আর্গ
ডকস

3

জাভা ৮-তে এটি করার আরও একটি উপায় আছে আমি যা প্রয়োজন তা পূরণ করার জন্য আমি 2 টি কাজ করছি:

  1. প্রবণতাযুক্ত ক্ষেত্রগুলি মোছার মাধ্যমে প্রকারের সাথে স্পষ্ট করে তোলে java.util.Optional
  2. নির্মাণের সময় সমস্ত অ-অযোগ্য ক্ষেত্র নাল নয় তা পরীক্ষা করা হচ্ছে java.util.Objects.requireNonNull

উদাহরণ:

import static java.util.Objects.requireNonNull;

public class Role {

  private final UUID guid;
  private final String domain;
  private final String name;
  private final Optional<String> description;

  public Role(UUID guid, String domain, String name, Optional<String> description) {
    this.guid = requireNonNull(guid);
    this.domain = requireNonNull(domain);
    this.name = requireNonNull(name);
    this.description = requireNonNull(description);
  }

সুতরাং আমার প্রশ্নটি হ'ল, জাভা 8 ব্যবহার করার সময় কি আমাদেরও বয়ান করতে হবে?

সম্পাদনা: পরে আমি জানতে পেরেছি যে কেউ কেউ তর্কগুলিতে ব্যবহার করার জন্য খারাপ অনুশীলন বিবেচনা করে Optional, এখানে পেশাদার ও কনসের সাথে একটি ভাল আলোচনা আছে কেন জাভা 8 এর arguচ্ছিকটি যুক্তিতে ব্যবহার করা উচিত নয়?

বিকল্প বিকল্প প্রদত্ত যে আর্গুমেন্টে ptionচ্ছিক ব্যবহার করার পরামর্শ দেওয়া হয় না, আমাদের 2 জন নির্মাতা প্রয়োজন:

  //Non null description
  public Role(UUID guid, String domain, String name, String description) {
        this.guid = requireNonNull(guid);
        this.domain = requireNonNull(domain);
        this.name = requireNonNull(name);

        // description will never be null
        requireNonNull(description);

        // but wrapped with an Optional
        this.description = Optional.of(description);
      }

  // Null description is assigned to Optional.empty
  public Role(UUID guid, String domain, String name) {
        this.guid = requireNonNull(guid);
        this.domain = requireNonNull(domain);
        this.name = requireNonNull(name);
        this.description = Optional.empty();
      }

আমি বলব যে 4 টি আনুষ্ঠানিক প্যারামিটারের জন্য আপনার এখনও নোটনুল টিকা প্রয়োজন so জাভা ভাষায় এমন কিছুই নেই যা প্রয়োগ করে। আপনি যদি ডিফেন্সিভভাবে প্রোগ্রামিং করেন তবে বিবরণটি নাল নয় এটিও পরীক্ষা করা উচিত।
jaxzin

2
আমি এখনও এই কোড লিখতে পারেন: new Role(null,null,null,null);। টীকাগুলির সাথে আমার আইডিই এবং স্থির বিশ্লেষণ সতর্ক করবে যে নালগুলি সেই পরামিতিগুলিতে পাস করা যাবে না। এটি ছাড়া কোডটি চালা না করা পর্যন্ত আমি খুঁজে পাই না। এটি টীকাগুলির মান।
jaxzin

2
আমি এমন পরিবেশেও রয়েছি যেখানে বিকাশকারীরা তাদের পছন্দসই কোনও IDE বা পাঠ্য সম্পাদক ব্যবহার করতে পারেন, এটি পরস্পর-একচেটিয়া নয়। এরপরে আমরা উত্সাহিত-হ'ল পিএমডি-প্লাগইন এবং / অথবা সোনারকিউবকে বিল্ড প্রক্রিয়ায় উত্সাহিত করতে ও হাইলাইট করার জন্য এবং এমনকি গেট, কোড মানের ইস্যুগুলির প্রাক-সংহতকরণ উদাহরণস্বরূপ, টানার অনুরোধগুলিতে একীভূত করি।
jaxzin

2
Ptionচ্ছিক মানে কোনও পদ্ধতি আর্গুমেন্ট বা ব্যক্তিগত ক্ষেত্র হিসাবে ব্যবহৃত হবে না। উদাহরণস্বরূপ দেখুন: stuartmark.wordpress.com/2016/09/27/vjug24-session-on-optional
assylias

1
@Asslias হ্যাঁ, আমি এটি পরে খুঁজে পেয়েছি, তারা বলেছে এটি প্রস্তাবিত নয় কারণ এটি আমাদের কিছু কিনবে না, আমি অবশ্যই তাদের যুক্তি বুঝতে পারি। এই ক্ষেত্রে আমি এখানে রেখেছি, কেউ যুক্তিটি description শূন্য নয় এবং ক্লায়েন্ট কোডটি একটি খালি স্ট্রিং পাস করতে পারে তবে বেশিরভাগ ক্ষেত্রে এটি স্ট্রিং এবং খালি স্ট্রিংয়ের মধ্যে পার্থক্য করতে সুবিধাজনক হতে পারে এবং তার মান নাও থাকতে পারে। আপনার মন্তব্যের জন্য ধন্যবাদ. আমি উত্তর আপডেট করব।
মোজার্ট ব্রোচিনি

2

এখন কি রোদের নিজস্ব নেই? এটি কী: http://www.java2s.com/Open-Source/Java-Docament/6.0-JDK- Module-com.sun / istack /
com.sun.istack.intern.htm

এটি গত কয়েক বছরের মধ্যে আমি জাভাটির সমস্ত সংস্করণে প্যাকেজড বলে মনে করেছি।

সম্পাদনা: নীচের মন্তব্যে উল্লিখিত হিসাবে আপনি সম্ভবত এগুলি ব্যবহার করতে চান না। সেক্ষেত্রে, আমার ভোটটি ইন্টেলিজ জেটব্রিন টীকাগুলির পক্ষে!


10
এটি কী তা আমার কোনও ধারণা নেই, তবে প্যাকেজের নামটি একটি বড় ক্লু হওয়া উচিত যা এটি সাধারণ ব্যবহারের জন্য নয়।
স্টিফেন সি

3
অভ্যন্তরীণ হওয়ায় একটি সাধারণত কম.সুন নেমস্পেসে ক্লাস ব্যবহার করা থেকে বিরত থাকে; সরাসরি ব্যবহারের জন্য নয়; এবং ডাব্লু / ও তাদের ভবিষ্যতের প্রাপ্যতা বা আচরণ সম্পর্কে কোনও গ্যারান্টি নেই। সরাসরি একটি com.Sun আর্টিক্ট ব্যবহার করার জন্য একটি সত্যই কঠিন মামলা থাকতে হবে।
luis.espinal

প্লাস এই জাতীয় দুর্বল HTML ফর্ম্যাটে প্রদর্শিত (জাভা 2s.com এ এটি শীর্ষে রাখার জন্য) আপনাকে কিছু লাল পতাকা দিতে হবে :)
luis.espinal

2

ইন্টেলিজিজের সম্পর্কে একটি দুর্দান্ত জিনিস হ'ল আপনার এনেটেশনগুলি ব্যবহার করার দরকার নেই। আপনি নিজের লেখা লিখতে পারেন, বা আপনার পছন্দ মতো অন্যান্য সরঞ্জামগুলি ব্যবহার করতে পারেন। আপনি একক ধরণের সীমাবদ্ধও নন। আপনি যদি দুটি লাইব্রেরি ব্যবহার করেন যা বিভিন্ন @ নটনুল টিকা ব্যবহার করে, আপনি উভয়টি ব্যবহার করতে ইন্টেলিজকে বলতে পারেন। এটি করতে, "পরিদর্শন কনফিগার করুন" এ যান, "কনস্ট্যান্ট শর্ত ও ব্যতিক্রম" পরিদর্শন ক্লিক করুন এবং "পরিদর্শন কনফিগার করুন" বোতামটি টিপুন। আমি যেখানে খুশি সেখানে নলনেস চেকার ব্যবহার করি, সুতরাং সেই টীকাগুলি ব্যবহার করতে আমি ইন্টেলিজিকে সেট আপ করেছি, তবে আপনি অন্য যে কোনও সরঞ্জামের সাহায্যে এটিকে কাজ করতে পারেন। (অন্যান্য সরঞ্জামগুলির বিষয়ে আমার কোনও মতামত নেই কারণ আমি বহু বছর ধরে ইন্টেলিজের পরিদর্শনগুলি ব্যবহার করে আসছি এবং আমি সেগুলি ভালবাসি))


1

অন্য বিকল্পটি এএনটিএলআর 4 দিয়ে দেওয়া টীকাগুলি 4: পুল অনুরোধ # 434 অনুসরণ করার পরে , @NotNullএবং @Nullableটীকাগুলি সম্বলিত নিদর্শনগুলিতে একটি টীকা প্রসেসর অন্তর্ভুক্ত রয়েছে যা সংকলন-সময় ত্রুটি এবং / অথবা সতর্কতাগুলি উত্পন্ন করে যা ঘটনার মধ্যে এই বৈশিষ্ট্যগুলির একটির অপব্যবহার করা হয় (উদাহরণস্বরূপ, উভয়ই একই আইটেমটিতে প্রয়োগ করা হয়, বা যদি @Nullableকোনও আদিম ধরণের আইটেমটিতে প্রয়োগ করা হয়)। সফটওয়্যার বিকাশ প্রক্রিয়া চলাকালীন টীকায় প্রসেসর অতিরিক্ত আশ্বাস সরবরাহ করে যে পদ্ধতিগুলির উত্তরাধিকারের ক্ষেত্রেও এই টীকাগুলির প্রয়োগ দ্বারা সরবরাহ করা তথ্য সঠিক।


1

যদি আপনি স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করে আপনার অ্যাপ্লিকেশনটি তৈরি করে থাকেন তবে আমি নীচের নির্ভরতার মধ্যে javax.validation.constraints.NotNullপ্যাকেটযুক্ত বিনস বৈধকরণ থেকে আগত ব্যবহারের পরামর্শ দেব :

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.1.0.Final</version>
    </dependency>

এই টীকা প্রধান সুবিধা হলো স্প্রিং উভয় পদ্ধতি পরামিতি এবং ক্লাস ক্ষেত্রের সাথে সটীক জন্য সমর্থন প্রদান করে javax.validation.constraints.NotNull। সমর্থন সক্ষম করতে আপনাকে যা করতে হবে তা হ'ল:

  1. মটরশুটি বৈধকরণের জন্য এপিআই জার সরবরাহ করুন এবং jsr-303 / jsr-349 টিকা রচনার (যা হাইবারনেট ভ্যালিডেটর 5.x নির্ভরতার সাথে আসে) কার্যকর করে:

    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
        <version>1.1.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.4.1.Final</version>
    </dependency>
  2. বসন্তের প্রসঙ্গে মেথডভ্যালিডেশনপোস্টপ্রসেসর সরবরাহ করুন

      @Configuration
      @ValidationConfig
      public class ValidationConfig implements MyService {
    
            @Bean
            public MethodValidationPostProcessor providePostProcessor() {
                  return new MethodValidationPostProcessor()
            }
      }
  3. অবশেষে আপনি স্প্রিংয়ের সাথে আপনার ক্লাসগুলি টীকায়িত করুন org.springframework.validation.annotation.Validatedএবং বৈধতা স্বয়ংক্রিয়ভাবে বসন্ত দ্বারা পরিচালিত হবে।

উদাহরণ:

@Service
@Validated
public class MyServiceImpl implements MyService {

  @Override
  public Something doSomething(@NotNull String myParameter) {
        // No need to do something like assert myParameter != null  
  }
}

আপনি যখন ডুডিং মেথডিং কল করার চেষ্টা করবেন এবং প্যারামিটারের মান হিসাবে নাল পাস করবেন, তখন বসন্ত (হাইবারনেটভালিডেটরের মাধ্যমে) নিক্ষেপ করবে ConstraintViolationException। এখানে মানুয়াল কাজের দরকার নেই।

আপনি ফিরে মানগুলিও বৈধ করতে পারেন।

javax.validation.constraints.NotNullমটরশুটি বৈধকরণ ফ্রেমওয়ার্কে আসার আরেকটি গুরুত্বপূর্ণ সুবিধা হ'ল এই মুহূর্তে এটি এখনও বিকাশযুক্ত এবং নতুন বৈশিষ্ট্য 2.0 এর নতুন বৈশিষ্ট্যগুলির জন্য পরিকল্পনা করা হয়েছে।

কি হবে @Nullable? বিনস ভ্যালিডেশন ১.১ এ এর ​​মতো কিছুই নেই। ঠিক আছে, আমি তর্ক করতে পারি যে আপনি যদি @NotNullসবকিছুতে টীকাযুক্ত নয় তার চেয়ে বেশি ব্যবহার করার সিদ্ধান্ত নেন @NonNullতবে কার্যকরভাবে "নলাবদ্ধ", সুতরাং @Nullableটীকাটি অকেজো।


1
দয়া করে এটি ব্যবহার করবেন না। এটি রানটাইম বৈধতার জন্য ব্যবহৃত হয়, স্থির কোড বিশ্লেষণের জন্য নয়। বিশদ জানতে jstsomejavaguy.blogspot.com/2011/08/… দেখুন । উত্স: @ luis.espinal দ্বারা 219 টি ভোট দিয়ে মুছে দেওয়া উত্তর।
কোপ্পোর

@ কোপ্পোর: আমি একমত নই যদি এটি ব্যবহারের উদ্দেশ্যে না হয় তবে বসন্ত এটি রানটাইম কেন পরিচালনা করবে। এছাড়াও বিনের বৈধতা কাঠামোটি রানটাইম বিশ্লেষণের জন্য বিশুদ্ধরূপে টীকাগুলি তৈরি করার অনুমতি দেয়, কারণ এটি রানটাইমে কনটেক্সট অবজেক্টে (বর্তমানে বর্ণিত / বৈধযুক্ত ইনস্ট্যান্সে) অ্যাক্সেসের অনুমতি দেয়।
ওয়াকারোস

0

প্যাকেজ স্তরে স্প্রিং 5 এর @ নননুলএপি রয়েছে। এটি ইতিমধ্যে স্প্রিং নির্ভরতা রয়েছে এমন কোনও প্রকল্পের জন্য সুবিধাজনক পছন্দ বলে মনে হচ্ছে। সমস্ত ক্ষেত্র, প্যারামিটার এবং রিটার্ন মানগুলি ডিফল্ট @ ননল এবং @ ননলেবল কয়েকটি পৃথক স্থানে প্রয়োগ করা যেতে পারে।

ফাইল প্যাকেজ- ইনফো.জভা:

@org.springframework.lang.NonNullApi
package com.acme;

https://docs.spring.io/spring-data/commons/docs/current/reference/html/#repositories.nullability.annotations

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.