කුමන otNotNull ජාවා විවරණය මා භාවිතා කළ යුතුද?


1030

NullPointerException වලක්වා ගැනීම සඳහා මගේ කේතය වඩාත් කියවිය හැකි කිරීමට මෙන්ම IDE කේත පරීක්ෂාව සහ / හෝ ස්ථිතික කේත විශ්ලේෂණය (FindBugs සහ Sonar) වැනි මෙවලම් භාවිතා කිරීමට මම බලාපොරොත්තු වෙමි. බොහෝ මෙවලම් එකිනෙකට නොගැලපෙන බව පෙනේ @NotNull/ @NonNull/ @Nonnullව්‍යාඛ්‍යාව සහ ඒවා සියල්ලම මගේ කේතයේ ලැයිස්තුගත කිරීම කියවීමට භයානක වනු ඇත. 'හොඳම' කුමන යෝජනා තිබේද? මෙන්න මම සොයාගත් සමාන විවරණ ලැයිස්තුව:

  • javax.validation.constraints.NotNull
    ස්ථිතික විශ්ලේෂණය නොව ධාවන කාල වලංගු කිරීම සඳහා නිර්මාණය කරන ලද්දකි.
    ප්‍රලේඛනය

  • edu.umd.cs.findbugs.annotations.NonNull
    විසින් භාවිතා Findbugs ස්ථිතික විශ්ලේෂණය සහ ඒ නිසා සෝනාර් (දැන් Sonarqube )
    ප්රලේඛනය

  • javax.annotation.Nonnull
    මෙය Findbugs සමඟද ක්‍රියා කළ හැකි නමුත් JSR-305 අක්‍රීයයි. (මෙයද බලන්න: JSR 305 හි තත්වය කුමක්ද? ) ප්‍රභවය

  • org.jetbrains.annotations.NotNull
    ස්ථිතික විශ්ලේෂණය සඳහා IntelliJ IDEA IDE විසින් භාවිතා කරයි.
    ප්‍රලේඛනය

  • lombok.NonNull
    ව්‍යාපෘති ලොම්බොක් හි කේත උත්පාදනය පාලනය කිරීමට භාවිතා කරයි .
    ප්‍රමිතියක් නොමැති බැවින් ස්ථාන දරන්නන්ගේ විවරණය.
    මූලාශ්‍රය , ප්‍රලේඛනය

  • android.support.annotation.NonNull
    ආධාරක-විවරණ පැකේජ ප්‍රලේඛනය මඟින් සපයනු ලබන ඇන්ඩ්‍රොයිඩ් හි සලකුණු විවරණය ලබා ගත හැකිය

  • org.eclipse.jdt.annotation.NonNull
    ස්ථිතික කේත විශ්ලේෂණ ලේඛන සඳහා සූර්යග්‍රහණය භාවිතා කරයි


205
අපාචේ විසින් "පොදු" විවරණයක් සහ එය වෙනත් ඕනෑම විවරණයකට පරිවර්තනය කළ හැකි මෙවලමක් නිර්මාණය කළ යුතුය. ඕනෑවට වඩා ප්‍රමිතීන් පිළිබඳ ගැටලුවට විසඳුම වන්නේ නව ප්‍රමිතියක් නිර්මාණය කිරීමයි.
ආපසු හැරවිය නොහැකි

6
apache නව "පොදු" එකක් නිර්මාණය කරන්නේ නම්, එහි අනුවාද 56 ක් ඇති අතර එය වෙනත් ව්‍යාපෘති සමඟ අතිච්ඡාදනය වේ. කෙසේ වෙතත්, එය කෙසේ හෝ සම්මත නොවනු ඇත (සම්මත! = පුළුල්). ජාවාක්ස්, සම්මත කිසිවක් භාවිතා කිරීම වඩා හොඳද?. *. BTW, එම උදාහරණවල “ඕනෑවට වඩා ප්‍රමිතීන්” නොමැත, මට 1 හෝ 2 ක් පෙනේ.
ymajoros

6
javax.annotation.Nonnull findbugs සමඟ වැඩ කරයි (එය දැන් පරීක්ෂා කර ඇත), එය මට එය භාවිතා කිරීමට බලවත් හේතුවකි.
නිකොලස් සී

20
මම සරලව otNotNull ලියන්නේ නම්, එය යොමු දක්වයි com.sun.istack.internal.NotNull. OMG ...
තෝමස් වෙල්ලර්

4
OzMozartBrocchini - ඔබ මීට පෙර NullObjects භාවිතා කර ඇති අවස්ථා වලදී විකල්ප ප්‍රයෝජනවත් වේ. ඔවුන් ඇත්ත වශයෙන්ම ධාවන කාලයට සමාන ඉලක්කයක් අමතන්නේ නැත ot නොට්ල් විවරණය වුවද, ඔවුන් වෙහෙසකාරී නොකැඩීම හඳුන්වා දෙයි.
ඩේව්

Answers:


220

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

7
අවාසිය javax.annotationනම් එය අ) මියගිය ජේඑස්ආර් මත පදනම්ව, ආ) විවරණයන් සපයන හා නඩත්තු කරන කෞතුක වස්තුවක් සොයා ගැනීම දුෂ්කර ය. Findbugs වලින් එකක් නොවේ: search.maven.org/…
රොබින්ස්ට්

19
ඊට එරෙහිව javax.annotationඇති තවත් කරුණක් නම්, එය ජාවා 9 සමඟ ගැටලු ඇති කරයි, මන්ද අනෙක් මොඩියුලයන් ද එම පැකේජයේ (ජැක්ස්-ඩබ්ලිව්) පන්ති සපයයි.
රොබින්ස්ට්

10
inkevinarpe: Findbugs ව්‍යාපෘතිය මියගොස් ඇති අතර අනුප්‍රාප්තික ව්‍යාපෘතිය වන Spotbugs විසින් එම විවරණ ඉවත් කරයි: github.com/spotbugs/spotbugs/pull/180
robinst

4
JSR 305 , ප්‍රමිතිගත කර ඇති අතර එය javax.annotation.NonNullකිසි විටෙකත් සම්පූර්ණ නොවීය. ඔරකල්ගේ කිසිදු තීරණයකට එයට කිසිදු සම්බන්ධයක් නොතිබුණි.
මාර්ක් රයින්හෝල්ඩ්

5
Jsr305.jar භාවිතා නොකිරීමට තවත් හේතුවක් නම්, එය පෙනෙන ආකාරයට ඔරකල් ජාවා ද්විමය බලපත්‍රය උල්ලං lates නය කිරීමයි
ප්‍රවාහය

94

මම චෙක්කර් රාමුවට බෙහෙවින් කැමතියි , එය වර්ගීකරණ විවරණයන් ( JSR-308 ) ක්‍රියාත්මක කිරීමකි. සැසඳීමක් කිරීමට මම වෙනත් කිසිවෙකු උත්සාහ කර නැත, නමුත් මෙම ක්‍රියාවට නැංවීම ගැන මම සතුටු වෙමි.

මෘදුකාංගය ලබා දෙන කණ්ඩායම සමඟ මම සම්බන්ධ නොවෙමි, නමුත් මම රසිකයෙක්මි.

මෙම පද්ධතිය ගැන මා කැමති කරුණු හතරක්:

  1. ඒ සඳහා කැළැල් සෙල්ලම කර nullness (@Nullable), පමණක් නොව, සඳහා අය කර පිළිම්ඹු හා interning (සහ වෙනත් අය). මම පළමු එක (ශුන්‍යතාවය) භාවිතා කරන අතර දෙවැන්න (නිශ්චලතාව / IGJ) භාවිතා කිරීමට උත්සාහ කරමි. මම තුන්වැන්න උත්සාහ කරමි, නමුත් එය දිගු කාලීනව භාවිතා කිරීම ගැන මට තවමත් විශ්වාස නැත. අනෙක් පරීක්ෂකයින්ගේ සාමාන්‍ය ප්‍රයෝජනය පිළිබඳව මට තවම ඒත්තු ගොස් නැත, නමුත් රාමුව යනු විවිධාකාර අතිරේක විවරණ සහ චෙක්පත් ක්‍රියාත්මක කිරීමේ පද්ධතියක් බව දැන ගැනීම සතුටක්.

  2. මෙම nullness පරීක්ෂා කිරීම සඳහා පෙරනිමි සැකසුම් වාසීන් (NNEL) හැර නොවන ශූන්ය: හොඳින් ක්රියා කරයි. මූලික වශයෙන් මින් අදහස් වන්නේ පෙරනිමියෙන් දේශීය විචල්යයන් හැර සෑම දෙයක්ම (නිදර්ශන විචල්යයන්, ක්රම පරාමිතීන්, සාමාන්ය වර්ග ආදිය) පරීක්ෂකයා සලකන්නේ පෙරනිමියෙන් @NonNull වර්ගයක් ඇති බවය. ප්‍රලේඛනය අනුව:

    NNEL පෙරනිමිය ඔබගේ කේතයේ ඇති කුඩාම පැහැදිලි විවරණ ගණනට මග පාදයි.

    NNEL ඔබ වෙනුවෙන් වැඩ නොකරන්නේ නම් ඔබට පන්තියක් සඳහා හෝ ක්‍රමයක් සඳහා වෙනස් පෙරනිමියක් සැකසිය හැකිය.

  3. මෙම ව්‍යාකරණ මඟින් ඔබේ ව්‍යාඛ්‍යාව විවරණයකට ඇතුළත් කිරීමෙන් රාමුව මත යැපීමක් ඇති නොකර භාවිතා කිරීමට ඉඩ ලබා දේ : උදා /*@Nullable*/. මෙය කදිමයි, මන්ද ඔබට පුස්තකාලයක් හෝ හවුල් කේතයක් විවරණය කර පරීක්ෂා කළ හැකි නමුත් රාමුව භාවිතා නොකරන වෙනත් ව්‍යාපෘතියක කේතගත කර ඇති එම පුස්තකාලය භාවිතා කළ හැකිය. මෙය කදිම ලක්ෂණයකි. මම දැන් මගේ සියලු ව්‍යාපෘති සඳහා චෙකර් රාමුව සක්‍රීය කිරීමට නැඹුරු වුවද, එය භාවිතා කිරීමට මම පුරුදු වී සිටිමි.

  4. රාමුව කිරීමට ක්රමයක් ඇති annotate ඒපීඅයි තවමත් අංකුර ලිපියකි ගොනු භාවිතා nullness සඳහා දැනටමත් විවරණ සහිත නොවන බව ඔබ භාවිතා කරන්න.


3
විශිෂ්ටයි වගේ මම එය භාවිතා කිරීමට කැමතියි, නමුත් බැහැ. ජීපීඑල් ඇයි? ඒ වෙනුවට එය LGPL විය නොහැකිද?
බුර්කාර්ඩ්

13
නිති අසන ප්‍රශ්න වලට අනුව : "වඩාත් අවසර ලත් එම්අයිටී බලපත්‍රය ඔබේම වැඩසටහනට ඇතුළත් කිරීමට අවශ්‍ය කේත වලට අදාළ වේ, එනම් විවරණ."
සීන්ෆ්

1
සබැඳි දැනට කැඩී ඇත. නමුත් චෙකර් රාමුව භාවිතා කිරීම පිළිබඳ උපදෙස් සඳහා +1.
පෝල් වැග්ලන්ඩ්

1
නවතම නිකුතුවේදී වෙනස් කළ නොහැකි පරීක්ෂකයින් අතහැර දැමීම කණගාටුවට කරුණකි.
ෆ්‍රැන්ක්ලින් යූ

1
ඔරකල් ජාවා නිබන්ධන වලද චෙකර් රාමුව යෝජනා කර ඇත .
ක්වාසි ඉර්ෆාන්

55

මම IntelliJ එකක් භාවිතා කරමි, මන්ද මම වැඩි වශයෙන් සැලකිලිමත් වන්නේ NPEL එකක් නිපදවිය හැකි දේවල් IntelliJ සලකුණු කිරීම ගැන ය. JDK හි සම්මත විවරණයක් නොතිබීම කලකිරීමට බව මම එකඟ වෙමි. එය එකතු කිරීම පිළිබඳ කතාබහක් ඇත, එය එය ජාවා 7 බවට පත් කළ හැකිය. එවැනි අවස්ථාවකදී තවත් එකක් තෝරා ගත හැකිය!


69
යාවත්කාලීන කිරීම: කේත ඉස්මතු කිරීම සඳහා IntelliJ දැන් ඉහත සඳහන් සියලුම විවරණ සඳහා සහය දක්වයි, එබැවින් ඔබ තවදුරටත් IntelliJ හි ව්‍යාඛ්‍යාවලට
ඩැනියෙල් ඇලෙක්සියුක්

31
සූර්යග්‍රහණ ජූනෝ ද එසේමය!
jFrenetic

5
javax.annotation.Nonnullවඩාත් පුළුල් ලෙස පිළිගනු ලැබේ, එසේ නොවේ ද?
මාටින්

1
An ඩැනියෙල් ඇලෙක්සියුක් නමුත් අවාසනාවකට මෙන්, එය එහි ධාවන කාල පරීක්ෂාවන් සඳහා ඒවා භාවිතා නොකරයි, එබැවින් ජෙට් බ්‍රේන්ස් භාවිතා කිරීමෙන් තවමත් වාසියක් ඇත ...
Trejkaz

4
@Trejkaz 2016.3 සිට එය ඒ සියල්ල සඳහා ධාවන කාල චෙක්පත් නිර්මාණය කරයි.
කැරොල් එස්

32

අනුව ජාවා 7 ලැයිස්තුව විශේෂාංග JSR-308 වර්ගය විවරණයන් ඉදිරිපත් ජාවා 8. JSR-305 විවරණයන් ඉදිරිපත් ඕක්තොම්බර් වුවද සඳහන් නොවේ.

නවතම JSR-308 කෙටුම්පතේ උපග්‍රන්ථයක JSR-305 තත්ත්වය පිළිබඳ සුළු තොරතුරු තිබේ . JSR-305 විවරණ අත්හැර දමා ඇති බව නිරීක්ෂණය කිරීම මෙයට ඇතුළත් ය. JSR-305 පිටුව ද එය "අක්‍රිය" ලෙස පෙන්වයි.

මධ්යන්ය කාලය තුළ, ප්රායෝගික පිළිතුර නම්, වඩාත් පුළුල් ලෙස භාවිතා කරන මෙවලම් මගින් සහාය දක්වන විවරණ වර්ග භාවිතා කිරීමයි ... සහ තත්වය වෙනස් වුවහොත් ඒවා වෙනස් කිරීමට සූදානම්ව සිටින්න.


ඇත්ත වශයෙන්ම, JSR-308 කිසිදු විවරණ වර්ග / පංති නිර්වචනය නොකරන අතර එය විෂය පථයෙන් බැහැර යැයි ඔවුන් සිතන බවක් පෙනේ. (JSR-305 හි පැවැත්මට අනුව ඒවා හරි ය).

කෙසේ වෙතත්, JSR-308 සැබවින්ම එය ජාවා 8 බවට පත් කිරීමක් සේ පෙනේ නම්, JSR-305 කෙරෙහි ඇති උනන්දුව යළිත් වරක් ඇති වුවහොත් එය මා පුදුමයට පත් නොකරනු ඇත. AFAIK, JSR-305 කණ්ඩායම ඔවුන්ගේ වැඩ කටයුතු විධිමත් ලෙස අතහැර දමා නැත. ඔවුන් අවුරුදු 2+ ක් තිස්සේ නිහ been ව සිට ඇත.

බිල් පුග් (JSR-305 සඳහා තාක්ෂණික නායකයා) FindBugs පිටුපස සිටින අයෙකු වීම සිත්ගන්නා කරුණකි.


4
@pst - වර්තමාන කාලසටහන ජාවා 8 සඳහා 2013 සැප්තැම්බර් මාසයේදී සාමාන්‍ය නිකුතුවකට යාමට - infoq.com/news/2012/04/jdk-8-milestone-release-dates
ස්ටීවන් සී

2
එය දැන් 2014 මාර්තු දක්වා පහත වැටී ඇත - openjdk.java.net/projects/jdk8 . JSR 308 M7 ගොඩනැගීමට ඇතුළත් කර ඇත ("104 - ජාවා වර්ග පිළිබඳ විවරණ" බලන්න).
ස්ටීවන් සී

28

ඇන්ඩ්‍රොයිඩ් ව්‍යාපෘති සඳහා ඔබ භාවිතා කළ යුතු android.support.annotation.NonNullඅතර android.support.annotation.Nullable. මෙම සහ වෙනත් ප්‍රයෝජනවත් ඇන්ඩ්‍රොයිඩ් විශේෂිත විවරණයන් ආධාරක පුස්තකාලයේ ඇත.

Http://tools.android.com/tech-docs/support-annotations වෙතින් :

ආධාරක පුස්තකාලය ද මෙම ව්‍යාඛ්‍යාන සමඟ විවරණය කර ඇත, එබැවින් ආධාරක පුස්තකාලයේ පරිශීලකයෙකු ලෙස, ඇන්ඩ්‍රොයිඩ් ස්ටුඩියෝ දැනටමත් ඔබේ කේතය පරීක්ෂා කර මෙම ව්‍යාඛ්‍යාන මත පදනම්ව ඇති විය හැකි ගැටළු සලකුණු කරයි.


3
එම නිර්දේශය සාධාරණීකරණය කිරීම ප්‍රයෝජනවත් වනු ඇත.
apricot

2
tools.android.com/tech-docs/support-annotations "සහයෝගය පුස්තකාල ම ද එසේ සහාය පුස්තකාලයේ පරිශීලක ලෙස, මෙම විවරණයන් ඉදිරිපත් සමග ග්රන්ථ කර ඇත, ඇන්ඩ්රොයිඩ් ශබ්දාගාර දැනටමත් මෙම විවරණයන් ඉදිරිපත් මත පදනම්ව ඔබේ කේතය සහ කොඩි හැකි ගැටළු පරීක්ෂා කරනු ඇත . "
ජේම්ස් වෝල්ඩ්

3
BTW සමග ඇන්ඩ්රොයිඩ් ශබ්දාගාර සහාය jsr305 javax.annotation.*ද විවරණයන් ඉදිරිපත්
CAMOBAP

19

යමෙක් හුදෙක් IntelliJ පන්ති සොයන්නේ නම්: ඔබට ඒවා මේවන් ගබඩාවෙන් ලබා ගත හැකිය

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

ඉන්ටෙලිජ් අනතුරු ඇඟවීම් කිරීමට හේතුව මෙයයි, ඔව්.
Upvote

වත්මන් අනුවාදය (05/2017 වන විට) 15.0
BamaPookie

ඔබේ අයිතිය. මම අනුවාදය යාවත්කාලීන කර ඇත. මම අනුමාන කළත් එය බොහෝ වෙනස් වී නැත.
එබර්හාඩ්

ජෙට් බ්‍රේන්ස් ව්‍යාඛ්‍යාව ධාවන කාලය සඳහා රඳවා නොගන්නා බව මතක තබා ගන්න, එබැවින් ගයිස් example නිදසුනක් ලෙස අනුබල දිය හැකි සහාය එය සමඟ ක්‍රියා නොකරයි.
පීටර් මේජර්

18

JSR305 සහ FindBugs රචනා කර ඇත්තේ එකම පුද්ගලයා විසිනි. දෙකම දුර්වල ලෙස නඩත්තු කර ඇති නමුත් එය ලබා ගන්නා තරමට ප්‍රමිතියකින් යුක්ත වන අතර සියලු ප්‍රධාන IDE වල සහාය ලැබේ. ශුභාරංචිය නම් ඔවුන් හොඳින් වැඩ කිරීමයි.

පෙරනිමියෙන් සියලුම පන්ති, ක්‍රම සහ ක්ෂේත්‍ර සඳහා onnnnull යෙදිය යුතු ආකාරය මෙන්න. 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
    {
    }

2. එක් එක් පැකේජයට ව්‍යාඛ්‍යාව එක් කරන්න: package-info.java

@NotNullByDefault
package com.example.foo;

යාවත්කාලීන කිරීම : 2012 දෙසැම්බර් 12 වන විට JSR 305 "අක්‍රිය" ලෙස ලැයිස්තු ගත කර ඇත. ප්‍රලේඛනයට අනුව:

විධායක කමිටුව විසින් "අක්‍රිය" ලෙස ඡන්දය දුන් ජේඑස්ආර් හෝ එහි ස්වාභාවික ආයු කාලය අවසන් වී ඇති එකක්.

පෙනෙන ආකාරයට JSR 308 වන JDK 8 බවට කරමින් සහ JSR @NotNull වත් නැත වුවත්, සමග Checkers Frameworkකරන්නේ නැහැ. මෙම දෝෂය හේතුවෙන් මේවන් ප්ලගිනය භාවිතා කළ නොහැක: https://github.com/typetools/checker-framework/issues/183


2
මේවන් සඳහා ප්‍රදර්ශනාගාර ගැටළුව නිරාකරණය කර ඇත. එබැවින් මෙය නැවත විකල්පයක් විය යුතුය.
මාක් වොන් රෙන්ටෙල්

මම මේවන් හරහා FindBugs භාවිතා කරමි, මගේ IDE විසින් කිසිවක් සිදු නොකෙරේ, මෙය IDE විශේෂිත විවරණයන් මගහරියි, ඔබ නිර්දේශ කරන්නේ කුමක්ද?
ක්‍රිස්ටෝෆ් රූසි

H ක්‍රිස්ටෝෆරූසි ඔබේ ප්‍රශ්නය IDE විශේෂිත වේ. කරුණාකර වෙනම ප්‍රශ්නයක් විවෘත කරන්න.
ගිලි

18

ස්ථිතික විශ්ලේෂණය සහ ධාවන කාල විශ්ලේෂණය අතර වෙනස හඳුනා ගන්න. අභ්‍යන්තර දේවල් සඳහා ස්ථිතික විශ්ලේෂණය සහ ඔබේ කේතයේ පොදු සීමාවන් සඳහා ධාවන කාල විශ්ලේෂණය භාවිතා කරන්න.

ශුන්‍ය නොවිය යුතු දේවල් සඳහා:

  • ධාවන කාල පරීක්ෂාව: "if (x == null) ..." (ශුන්‍ය පරායත්තතාව) හෝ @ javax.validation.NotNull (බෝංචි වලංගු කිරීම සමඟ) හෝ @ lombok.NonNull (සරල හා සරල) හෝ ගුවාස් Preconditions.checkNotNull (.. .)

    • ක්‍රම ආපසු යැවීමේ වර්ග සඳහා විකල්ප භාවිතා කරන්න (පමණක්). එක්කෝ ජාවා 8 හෝ ගුවා.
  • ස්ථිතික පරීක්ෂාව: onNonNull ව්‍යාඛ්‍යාවක් භාවිතා කරන්න

  • එය ගැළපෙන තැන, පන්තියේ හෝ පැකේජ මට්ටමින් @ ... NonnullByDefault විවරණ භාවිතා කරන්න. මෙම ව්‍යාඛ්‍යාවන් ඔබම සාදන්න (උදාහරණ සොයා ගැනීම පහසුය).
    • නැතහොත්, NPE භාවිතා කිරීමෙන් check ... CheckForNull ක්‍රමවේදය නැවත භාවිතා කරන්න

මෙය හොඳම ප්‍රති result ලය ලබා දිය යුතුය: IDE හි අනතුරු ඇඟවීම්, Findbugs සහ Checkerframework හි දෝෂ, අර්ථවත් ධාවන කාල ව්‍යතිරේක.

ස්ථිතික චෙක්පත් පරිණත වනු ඇතැයි අපේක්ෂා නොකරන්න, ඒවායේ නම් කිරීම ප්‍රමිතිගත නොවන අතර විවිධ පුස්තකාල සහ IDEs ඒවාට වෙනස් ලෙස සලකයි, නොසලකා හරින්න. JSR305 javax.annotations. * පන්ති සම්මත ලෙස පෙනේ, නමුත් ඒවා එසේ නොවේ, ඒවා Java9 + සමඟ බෙදීම් පැකේජ ඇති කරයි.

සමහර සටහන් පැහැදිලි කිරීම්:

  • Javax.validation පැකේජය සමඟ Findbugs / spotbugs / jsr305 විවරණ. * Java9 + හි වෙනත් මොඩියුල සමඟ ගැටීම, සමහර විට ඔරකල් බලපත්‍රය උල්ලං late නය කරයි
  • Spotbugs ව්‍යාඛ්‍යාව තවමත් රඳා පවතින්නේ jsr305 / findbugs annotations on compiletime ( https://github.com/spotbugs/spotbugs/issues/421 ලියන අවස්ථාවේදී )
  • jetbrains otNotNull නම @ javax.validation.NotNull සමඟ ගැටෙයි.
  • ස්ථිතික පරීක්ෂාව සඳහා ජෙට්බ්‍රේන්, සූර්යග්‍රහණය හෝ චෙකර්ස්ෆ්‍රේම්වර්ක් විවරණයන් javax.annotations වලට වඩා වාසියක් ඇති අතර ඒවා ජාවා 9 සහ ඊට වැඩි වෙනත් මොඩියුල සමඟ ගැටෙන්නේ නැත.
  • (javax.annotations.Nullable යන්නෙන් අදහස් කරන්නේ ඔබ (හෝ ඔබේ IDE) අදහස් කරන දේ Findbugs / Spotbugs යන්න නොවේ. Findbugs එය නොසලකා හරිනු ඇත (සාමාජිකයන් මත). කනගාටුදායක නමුත් සත්‍යය ( https://sourceforge.net/p/findbugs/bugs/1181 )
  • IDE එකකින් පිටත ස්ථිතික පරීක්ෂාව සඳහා, නොමිලේ මෙවලම් 2 ක් පවතී: Spotbugs (කලින් Findbugs) සහ checkersframework.
  • සූර්යග්‍රහණ පුස්තකාලයට @NonNullByDefault ඇත, jsr305 සතුව ඇත්තේ @ParametersAreNonnullByDefault පමණි. ඒවා හුදෙක් පැකේජයක (හෝ පන්තියේ) සෑම දෙයකටම පදනම් විවරණ යෙදෙන පහසුව සඳහා වන ආවරණ වේ, ඔබට පහසුවෙන් ඔබේම දෑ සෑදිය හැකිය. මෙය පැකේජයේ භාවිතා කළ හැකිය. මෙය ජනනය කළ කේතය (උදා: ලොම්බොක්) සමඟ ගැටෙනු ඇත.
  • අපනයන යැපීමක් ලෙස ලොම්බොක් භාවිතා කිරීම ඔබ වෙනත් පුද්ගලයින් සමඟ බෙදා ගන්නා පුස්තකාල සඳහා වළක්වා ගත යුතුය, අඩු සංක්‍රාන්ති පරායත්තතා, වඩා හොඳ
  • බීන් වලංගු කිරීමේ රාමුව භාවිතා කිරීම බලවත් ය, නමුත් ඉහළ පොදු කාර්යයක් අවශ්‍ය වේ, එබැවින් එය අතින් ශුන්‍ය පරීක්‍ෂා කිරීමෙන් වළක්වා ගැනීම සඳහා අධික ලෙස මරා දමයි.
  • ක්ෂේත්‍ර සහ ක්‍රම පරාමිතීන් සඳහා විකල්ප භාවිතා කිරීම මතභේදාත්මක ය (ඔබට ඒ පිළිබඳ ලිපි පහසුවෙන් සොයාගත හැකිය)
  • ඇන්ඩ්‍රොයිඩ් ශුන්‍ය විවරණයන් ඇන්ඩ්‍රොයිඩ් ආධාරක පුස්තකාලයේ කොටසකි, ඒවා වෙනත් පන්ති රාශියක් සමඟ එන අතර වෙනත් විවරණ / මෙවලම් සමඟ හොඳින් ක්‍රීඩා නොකරන්න

Java9 ට පෙර, මෙය මගේ නිර්දේශයයි:

// 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);
        }

මෙය සේවාදායකයින්ට ශුන්‍ය නොවීම (නිවැරදි කේතය ලිවීම) සඳහා උපකාරී වන අතර ප්‍රයෝජනවත් දෝෂ නැවත ලබා දෙයි.


මට මෙම පිළිතුර හමු වූයේ දැන් පමණි, නමුත් ktkruse, ඔබ මෙය සොයාගත්තේ කොහෙන්ද: "සූර්යග්‍රහණ jdt විවරණ ස්ථිතික ක්‍රම ප්‍රතිලාභ සහ වෙනත් අවස්ථා සඳහා අදාළ නොවේ"? (පළමු කොටස සත්‍ය නොවේ, දෙවන කොටස තරමක් අපැහැදිලි :)).
ස්ටීවන් හර්මන්

St ස්ටෙෆාන් හර්මන්: මට මතක නැහැ. මම වෙඩි උණ්ඩය ඉවත් කළා.
tkruse

12

සූර්යග්‍රහණයට තමන්ගේම විවරණ ඇත.

org.eclipse.jdt.annotation.NonNull

වැඩි විස්තර සඳහා http://wiki.eclipse.org/JDT_Core/Null_Analysis බලන්න.


මෙය එක්ලිප්ස් 3.8 (ජූනෝ) වෙතින් ඒකාබද්ධ වීමට යන බව පෙනේ, මේ සම්බන්ධයෙන් ඉන්ටෙලිජේ සමඟ සූර්යග්‍රහණය ගෙන එනු ඇත. එසේම එය ඔබගේම ශුන්‍ය විවරණයන් (උදා: javax.annotation.Nonnull) වින්‍යාස කිරීමට ඉඩ දිය යුතු අතර පෙරනිමිය නොට්නෝල් කිරීමට විකල්පයක් ඇත.
Motti Strom

11

ජාවා වලංගු කිරීමේ API ( javax.validation.constraints.*) @Nullableවිවරණයක් සමඟ නොපැමිණෙන බව පෙන්වා දෙමින් එය ස්ථිතික විශ්ලේෂණ සන්දර්භය තුළ ඉතා වටී. ජාවා හි ඕනෑම ප්‍රාථමික නොවන ක්ෂේත්‍රයක පෙරනිමිය වන බැවින් (එනම් වලංගු කිරීමට / බලාත්මක කිරීමට කිසිවක් නැත) බැවින් එය ධාවන බෝංචි වලංගු කිරීම අර්ථවත් කරයි. සඳහන් කර ඇති අරමුණු සඳහා විකල්පයන් මත බර තැබිය යුතුය.


7

අවාසනාවකට මෙන්, JSR 308මෙම ව්‍යාපෘතියේ දේශීය නොවන ශුන්‍ය යෝජනාවට වඩා වැඩි අගයක් මෙහි ඇතුළත් නොවේ

Java 8තනි පෙරනිමි විවරණයක් හෝ තමන්ගේම Checkerරාමුවක් සමඟ නොඑනු ඇත. Find-bugs හා සමානව JSR 305, මෙම JSR බොහෝ දුරට අධ්‍යයන කණ්ඩායම් කුඩා කණ්ඩායමක් විසින් දුර්වල ලෙස නඩත්තු කරනු ලැබේ.

, එය පිටුපස කිසිදු වාණිජ බලය අනුව JSR 308දියත් EDR 3(මුල් කෙටුම්පත සමාලෝචන දී JCP) දැන්, අතර Java 8මාස 6 කට වඩා අඩු නැව කිරීමට නියමිත ව තිබේ: කිරීමට -O සමාන 310btw. නමුත් 308 Oracleඑය දැන් ජාවා වේදිකාවට කරන හානිය අවම කිරීම සඳහා එහි ආරම්භකයින්ගෙන් away ත්වී ඇත.

පිටුපස ඇති අය මෙන් සෑම ව්යාපෘතියක්, වෙළෙන්දාට හා අධ්යයන පන්ති Checker Frameworkසහ JSR 308එහි ම වානිජ අරඹන්න කාරක සභාවකින් නිර්මාණය කරනු ඇත.

ජනප්‍රිය සම්මුතීන් කිහිපයක් සොයා ගත හැකි වන තෙක් Java 9හෝ සමහර විට එකතු කළ හැකි හෝ හෝ 10, Apache Commonsහෝ Google Guava;-) වැනි රාමු හරහා ප්‍රභව කේත නොගැලපීම.


7

Android

මෙම පිළිතුර ඇන්ඩ්‍රොයිඩ් විශේෂිත වේ. ඇන්ඩ්‍රොයිඩ් සතුව ආධාරක පැකේජයක් 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

ඔබ ඇන්ඩ්‍රොයිඩ් සඳහා සංවර්ධනය කරන්නේ නම්, ඔබ සූර්යග්‍රහණය සමඟ තරමක් බැඳී ඇත (සංස්කරණය කරන්න: ලිවීමේ වේලාවේදී, තවදුරටත් නොවේ), එහි විවරණ ඇත. එය සූර්යග්‍රහණය 3.8+ (ජූනෝ) හි ඇතුළත් කර ඇති නමුත් පෙරනිමියෙන් අක්‍රීය කර ඇත.

ඔබට එය මනාප> ජාවා> සම්පාදක> දෝෂ / අනතුරු ඇඟවීම්> ශුන්‍ය විශ්ලේෂණය (පතුලේ බිඳ දැමිය හැකි කොටස) වෙතින් සක්‍රිය කළ හැකිය.

"විවරණ පාදක ශූන්‍ය විශ්ලේෂණය සක්‍රීය කරන්න" පරීක්ෂා කරන්න

http://wiki.eclipse.org/JDT_Core/Null_Analysis#Usage හි සැකසුම් පිළිබඳ නිර්දේශ ඇත. කෙසේ වෙතත්, ඔබේ සේවා ස්ථානයේ (ෆේස්බුක් එස්ඩීකේ වැනි) බාහිර ව්‍යාපෘති තිබේ නම්, ඒවා එම නිර්දේශයන් සපුරාලන්නේ නැති අතර, එක් එක් එස්ඩීකේ යාවත්කාලීන කිරීම් සමඟ ඒවා නිවැරදි කිරීමට ඔබට අවශ්‍ය නොවනු ඇත ;-)

මම භාවිතා කරන්නේ:

  1. ශුන්‍ය දර්ශක ප්‍රවේශය: දෝෂයකි
  2. ශුන්‍ය පිරිවිතර උල්ලං lation නය කිරීම: දෝෂය (# 1 ලක්ෂ්‍යයට සම්බන්ධ කර ඇත)
  3. විභව ශුන්‍ය දර්ශක ප්‍රවේශය: අවවාදයයි (එසේ නොමැතිනම් ෆේස්බුක් එස්ඩීකේ වෙත අනතුරු ඇඟවීම් ඇත)
  4. ශුන්‍ය විවරණ සහ ශුන්‍ය අනුමානයන් අතර ගැටුම: අවවාදයයි (# 3 ලක්ෂ්‍යයට සම්බන්ධ කර ඇත)

4
සූර්යග්‍රහණයට බැඳී තිබේද? සත්‍ය නොවේ.
dcow

1
AndroidDow`ing සඳහා සහය ඇතිව ඩේවිඩ්කවුන් ඉන්ටෙලි අයිඩීඒ, ඇන්ඩ්‍රොයිඩ් ස්ටූඩියෝ හඳුන්වාදීමට ටික කලකට පෙර ලබා ගත හැකි යැයි මම සිතමි.
මාර්ටික් බ්‍රෙඩිස්

@ MņšrtiņšBriedis ඔව්, ඒක ඇත්ත. මම හිතන්නේ ඔයා අදහස් කලේ @chaqke.
dcow

ඇන්ඩ්‍රොයිඩ් සහ ඉන්ටෙලිජ් සඳහා වෙනම විවරණ ඇති බව සඳහන් කිරීම වටී. ජාවාහි නිල විවරණ ඇතුළත් වන තෙක් එය එලෙසම පවතිනු ඇත. මේවා සූර්යග්‍රහණය සමඟ සූර්යග්‍රහණ විවරණයන් භාවිතා කිරීම සඳහා උපදෙස් වේ.
චක්කේ

එය කිසි විටෙකත් සූර්යග්‍රහණයට බැඳී නොමැත. ඔබට අවශ්‍ය ඕනෑම IDE එකක් භාවිතා කළ හැකිය.
ඩෙනිස්ක්

4

ඔබ විශාල ව්‍යාපෘතියක වැඩ කරන්නේ නම්, ඔබේම @Nullable සහ / හෝ @NotNullවිවරණ නිර්මාණය කිරීමට වඩා හොඳ විය හැකිය .

උදාහරණයක් වශයෙන්:

@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 
{
}

ඔබ නිවැරදි රඳවා ගැනීමේ ප්‍රතිපත්තියක් භාවිතා කරන්නේ නම්, ව්‍යාඛ්‍යාව ක්‍රියාත්මක වන වේලාවේදී ලබා ගත නොහැක . එම දෘෂ්ටි කෝණයෙන් බලන කල එය අභ්‍යන්තර දෙයක් පමණි.

මෙය දැඩි විද්‍යාවක් නොවුනත්, ඒ සඳහා අභ්‍යන්තර පංතියක් භාවිතා කිරීම වඩාත් අර්ථවත් යැයි මම සිතමි .

  • එය අභ්‍යන්තර දෙයක්. (ක්‍රියාකාරී හෝ තාක්ෂණික බලපෑමක් නැත)
  • බොහෝ භාවිතයන් සමඟ.
  • IDE වැනි IntelliJ අභිරුචි @Nullable/ විවරණ සඳහා සහය දක්වයි @NotNull.
  • බොහෝ රාමු ඔවුන්ගේම අභ්‍යන්තර අනුවාදය භාවිතා කිරීමට කැමැත්තක් දක්වයි.

අමතර ප්‍රශ්න (අදහස් බලන්න):

IntelliJ හි මෙය වින්‍යාස කරන්නේ කෙසේද?

IntelliJ තත්ව තීරුවේ පහළ දකුණු කෙළවරේ ඇති “පොලිස් නිලධාරියා” ක්ලික් කරන්න. උත්පතන තුළ "පරීක්ෂණ වින්‍යාස කරන්න" ක්ලික් කරන්න. ඊලඟ ... විවරණ වින්‍යාස කරන්න


1
මම ඔබේ උපදෙස් උත්සාහ කළ නමුත් ideaගැන කිසිවක් කියන්න void test(@NonNull String s) {}විසින් කැඳවාtest(null);
user1244932

3
@ user1244932 ඔබ අදහස් කළේ IntelliJ IDEA ද? ස්ථිතික විශ්ලේෂණය සඳහා එය භාවිතා කරන ශුන්‍යතා විවරණයන් ඔබට වින්‍යාසගත කළ හැකිය. මම හරියටම කොහේදැයි නොදනිමි, නමුත් ඒවා අර්ථ දැක්විය හැකි එක් ස්ථානයක් "ගොනුව> සැකසීම්> ගොඩනැගීම, ක්‍රියාත්මක කිරීම, යෙදවීම> සම්පාදකයා" සහ එහි "විවරණ වින්‍යාස කරන්න ..." බොත්තමක් ඇත.
අදෝරත්

12 user1244932 ඔබ තවමත් මෙය සොයන්නේ නම් තිර රුව බලන්න.
bvdb

4

ජාවා 8 හි මෙය කිරීමට තවත් ක්‍රමයක් තිබේ. මට අවශ්‍ය දේ ඉටු කිරීම සඳහා මම කරුණු 2 ක් කරමි:

  1. ශුන්‍ය කළ හැකි ක්ෂේත්‍ර එතීමෙන් වර්ග සමඟ නිරවුල් කළ හැකි ක්ෂේත්‍ර පැහැදිලි කිරීම java.util.Optional
  2. ඉදිකිරීම් වේලාවේදී අහෝසි කළ නොහැකි සියලුම ක්ෂේත්‍ර අහෝසි වී ඇත්දැයි පරීක්ෂා කිරීම java.util.Objects.requireNonNull

උදාහරණයක්:

සංස්කරණය කරන්න: මෙම 1 වන උදාහරණය නොසලකා හරින්න, මම මෙහි අදහස් දැක්වීමේ සංවාදයේ සන්දර්භය ලෙස තබමි. මෙයින් පසු නිර්දේශිත විකල්පය වෙත යන්න (2 වන කේත වාරණය).

    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 හි විකල්පය තර්ක වලදී භාවිතා නොකළ යුත්තේ ඇයි?

නිර්දේශිත විකල්පය තර්කයේ විකල්ප භාවිතා කිරීම වඩා හොඳ පුරුද්දක් නොවන බැවින් අපට ඉදිකිරීම්කරුවන් 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 සඳහාම ඔබට තවමත් otNotNull විවරණය අවශ්‍ය බව මම කියමි, එවිට ස්ථිතික විශ්ලේෂණ පරීක්ෂකයින් කිසිවෙකු ශුන්‍ය නොවිය යුතුය යන ඔබේ අභිප්‍රාය දනී. ජාවා භාෂාවෙන් තවම එය බලාත්මක කරන කිසිවක් නොමැත. ඔබ ආරක්ෂිතව වැඩසටහන්ගත කරන්නේ නම් එම විස්තරය අහෝසි නොවන බව ඔබ පරීක්ෂා කළ යුතුය.
ජැක්ස්

2
මට තවමත් මෙම කේතය ලිවිය හැකිය : new Role(null,null,null,null);. විවරණයන් සමඟ මගේ IDE සහ ස්ථිතික විශ්ලේෂණය මඟින් අනතුරු අඟවනුයේ එම පරාමිතීන් තුළට ශුන්‍යය ලබා දිය නොහැකි බවයි. එය නොමැතිව මම කේතය ක්‍රියාත්මක කරන තුරු සොයා ගන්නේ නැත. එය විවරණ වල වටිනාකමයි.
ජැක්ස්

2
සංවර්ධකයින්ට ඔවුන් කැමති ඕනෑම IDE හෝ පෙළ සංස්කාරකයක් භාවිතා කළ හැකි පරිසරයක මම සිටිමි, එය අන්‍යෝන්‍ය වශයෙන් නොවේ. අපි පසුව maven-pmd-plugin සහ / හෝ SonarQube ඒකාබද්ධ කිරීමේ ක්‍රියාවලියට අනුබල දෙමු.
jaxzin

2
විකල්පය ක්‍රම තර්කයක් හෝ පුද්ගලික ක්ෂේත්‍රයක් ලෙස භාවිතා කිරීමට අදහස් නොකෙරේ. උදාහරණයක් ලෙස බලන්න: stuartmarks.wordpress.com/2016/09/27/vjug24-session-on-optional
assylias

1
@assylias ඔව්, පසුව මට පෙනී ගියේ ඔවුන් එය නිර්දේශ නොකරයි කියායි, ​​මන්ද එය අපට කිසිවක් මිලට නොගනු ඇත, මට ඔවුන්ගේ තාර්කිකත්වය නිසැකවම තේරුම් ගත හැකිය. මෙම අවස්ථාවෙහිදී, යමෙකුට තර්කය description අහෝසි කළ නොහැකි අතර සේවාදායක කේතයට හිස් නූලක් පසු කළ හැකිය, නමුත් බොහෝ අවස්ථාවන්හීදී සහ හිස් නූල් අතර වෙනස හඳුනා ගැනීමට පහසු වන අතර වටිනාකමක් නැත. ඔබගේ අදහස් දැක්වීමට ස්තූතියි. මම පිළිතුර යාවත්කාලීන කරමි.
මොසාර්ට් බ්‍රොචිනි

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>

ශ්‍රේණිය:

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

2
හ්ම්, මෙය වෙනත් ආකාරයකින් කියයි: kotlinlang.org/docs/reference/…
skagedal

2

සූර්යයාට දැන් ඔවුන්ගේම දෑ නැද්ද? මේ කුමක්ද:
http://www.java2s.com/Open-Source/Java-Document/6.0-JDK-Modules-com.sun/istack/com.sun.istack.internal.htm

මෙය පසුගිය වසර කිහිපය තුළ මා භාවිතා කළ ජාවා හි සියලුම සංස්කරණ සමඟ ඇසුරුම් කර ඇති බව පෙනේ.

සංස්කරණය කරන්න: පහත දැක්වෙන අදහස්වල සඳහන් කර ඇති පරිදි, ඔබට මේවා භාවිතා කිරීමට අවශ්‍ය නොවනු ඇත. එවැනි අවස්ථාවක, මගේ ඡන්දය IntelliJ ජෙට්බ්‍රේන් විවරණ සඳහා ය!


10
එය කුමක්දැයි මට අදහසක් නැත, නමුත් පැකේජයේ නම විශාල භාවිතයක් විය යුතු අතර එය සාමාන්‍ය භාවිතය සඳහා අදහස් නොකෙරේ.
ස්ටීවන් සී

3
සාමාන්‍යයෙන් com.sun නාම අවකාශයේ පන්ති අභ්‍යන්තර බැවින් ඒවා භාවිතා කිරීමෙන් වැළකී සිටියි. සෘජු භාවිතය සඳහා අදහස් නොකෙරේ; සහ ඔවුන්ගේ අනාගත උපයෝජ්‍යතාව හෝ හැසිරීම සම්බන්ධයෙන් කිසිදු සහතිකයක් නොමැත. Com.sun කෞතුක භාණ්ඩයක් සෘජුවම භාවිතා කිරීම සඳහා යමෙකුට case න නඩුවක් තිබිය යුතුය.
luis.espinal

එබඳු දුර්වල HTML ආකෘතියකින් ප්‍රදර්ශනය වන යමක් (එය ඉහළට ඔසවා තැබීමට Java2s.com හි) ඔබට රතු කොඩි කිහිපයක් ලබා දිය යුතුය :)
luis.espinal

2

ඔබ ඔබේ යෙදුම වසන්ත රාමුව භාවිතයෙන් 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 විවරණ වල වලංගුකාරකය ක්‍රියාත්මක කිරීමත් සමඟ බෝංචි වලංගු කිරීම සහ භාජනය සැපයීම සඳහා api jar සැපයීම (එය ශිශිරතර Validator 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. වසන්තයේ සන්දර්භයට MethodValidationPostProcessor ලබා දෙන්න

      @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  
  }
}

ඔබ doSomething ඇමතීමට උත්සාහ කළ විට සහ පරාමිති අගය ලෙස ශුන්‍යය පසු කළ විට, වසන්තය (HibernateValidator මගින්) විසි ConstraintViolationExceptionකරයි. මෙහි මැනුවල් වැඩ අවශ්‍ය නොවේ.

ඔබට ප්‍රතිලාභ අගයන් වලංගු කළ හැකිය.

javax.validation.constraints.NotNullබෝංචි වලංගුකරණ රාමුව සඳහා පැමිණීමේ තවත් වැදගත් වාසියක් වන්නේ මේ වන විට එය තවමත් සංවර්ධනය වී ඇති අතර නව අනුවාද 2.0 සඳහා නව විශේෂාංග සැලසුම් කර තිබීමයි.

කුමක් ගැනද @Nullable? බෝංචි වලංගුකරණයේ එවැනි දෙයක් නොමැත 1.1. හොඳයි, මට තර්ක කළ හැකිය, ඔබ විසින් විවරණය කර නැති @NotNullසියල්ලට වඩා භාවිතා කිරීමට තීරණය කළහොත් effectively ලදායී @NonNullලෙස “අහෝසි කළ හැකිය”, එබැවින් ව්‍යාඛ්‍යාව නිෂ් .ල ය @Nullable.


2
කරුණාකර එය භාවිතා නොකරන්න. එය ධාවන කාල වලංගු කිරීම සඳහා භාවිතා කරයි, ස්ථිතික කේත විශ්ලේෂණය නොවේ. වැඩි විස්තර සඳහා justsomejavaguy.blogspot.com/2011/08/… බලන්න. මූලාශ්‍රය: ඡන්ද 219 ක් සමඟ මකා දැමූ පිළිතුර @ luis.espinal.
koppor

කොපර්: මම එකඟ නොවෙමි. මෙය භාවිතය සඳහා අදහස් නොකෙරේ නම්, ධාවන වේලාවේදී වසන්තය එය හැසිරවිය යුත්තේ ඇයි? එසේම, බෝංචි වලංගු කිරීමේ රාමුව මඟින් ධාවන කාල විශ්ලේෂණය සඳහා තනිකරම විවරණ නිර්මාණය කිරීමට ඉඩ සලසයි, මන්ද එය ධාවන වේලාවේදී සන්දර්භය වස්තුවට (දැනට විවරණය කර ඇති / වලංගු කරන ලද instancje) ප්‍රවේශ වීමට ඉඩ සලසයි.
walkeros

2

IntelliJ හි ඇති හොඳ දෙයක් නම්, ඒවායේ විවරණ භාවිතා කිරීමට ඔබට අවශ්‍ය නොවන බවයි. ඔබට ඔබේම දෑ ලිවිය හැකිය, නැතහොත් ඔබ කැමති වෙනත් ඕනෑම මෙවලමක් භාවිතා කළ හැකිය. ඔබ තනි වර්ගයකට පමණක් සීමා නොවේ. ඔබ විවිධ otNotNull විවරණ භාවිතා කරන පුස්තකාල දෙකක් භාවිතා කරන්නේ නම්, ඔබට ඒ දෙකම භාවිතා කරන ලෙස IntelliJ ට පැවසිය හැකිය. මෙය සිදු කිරීම සඳහා, "පරීක්ෂණ වින්‍යාස කිරීම" වෙත ගොස්, "නිරන්තර කොන්දේසි සහ ව්‍යතිරේක" පරීක්ෂාව මත ක්ලික් කර "පරීක්ෂණ වින්‍යාස කරන්න" බොත්තම ඔබන්න. මට හැකි සෑම තැනකම මම ශුන්‍ය පරීක්ෂකය භාවිතා කරමි, එම නිසා එම ව්‍යාඛ්‍යාවන් භාවිතා කිරීම සඳහා මම IntelliJ සකස් කළෙමි, නමුත් ඔබට අවශ්‍ය වෙනත් මෙවලමක් සමඟ එය ක්‍රියාත්මක කළ හැකිය. (වෙනත් මෙවලම් පිළිබඳව මට කිසිදු අදහසක් නැත, මන්ද මම වසර ගණනාවක් තිස්සේ ඉන්ටෙලිජේගේ පරීක්ෂණ භාවිතා කර ඇති අතර මම ඒවාට ආදරෙයි.)


1

තවත් විකල්පයක් වන්නේ ANTLR 4 සමඟ සපයා ඇති ව්‍යාඛ්‍යාවයි. අදින්න # 434 ට පසුව , @NotNullසහ @Nullableව්‍යාඛ්‍යාවල අඩංගු කෞතුක වස්තුවට මෙම ගුණාංගවලින් එකක් අනිසි ලෙස භාවිතා කළ හොත් සම්පාදක කාල දෝෂ සහ / හෝ අනතුරු ඇඟවීම් නිපදවන විවරණ සකසනයක් ඇතුළත් වේ (නිදසුනක් ලෙස, දෙකම එකම අයිතමයට අදාළ වේ, නැතහොත් @Nullableප්‍රාථමික වර්ගයක් සහිත අයිතමයකට යොදනු ලැබේ නම් ). ක්‍රමෝපාය උරුමයන් ඇතුළුව මෙම ව්‍යාඛ්‍යාන යෙදීමෙන් ලබා දෙන තොරතුරු නිවැරදි බව විකාශන සකසනය මෘදුකාංග සංවර්ධන ක්‍රියාවලියේදී අමතර සහතිකයක් සපයයි.


0

වසන්ත 5 හි පැකේජ මට්ටමින් onNonNullApi ඇත. දැනටමත් වසන්ත පරායත්තතා ඇති ව්‍යාපෘතියක් සඳහා මෙය පහසු තේරීමක් සේ පෙනේ. සියළුම ක්ෂේත්‍ර, පරාමිතීන් සහ ප්‍රතිලාභ අගයන් defaultNonNull සහ ulNullable වෙත පෙරනිමියෙන් වෙනස් වන ස්ථාන කිහිපයක යෙදිය හැකිය.

ගොනු පැකේජය- info.java:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.