Java.util এর অর্থ কী? @ নলবল?


56

আমি পেয়ারা কোডটি পড়ছি যেখানে আমি java.util.@Nullableকিছু কোডে টীকা পেয়েছি । আমি এর অর্থ জানি @Nullableতবে আমি এটি বুঝতে পারি না। বিশেষত, আমি Nullableপ্যাকেজে ডাকা একটি ক্লাস খুঁজে পাচ্ছি না java.util। দয়া করে, কেউ আমাকে বলুন এর অর্থ কী java.util.@Nullable:

public static <T> java.util.@Nullable Optional<T> toJavaUtil(
    @Nullable Optional<T> googleOptional) {
  return googleOptional == null ? null : googleOptional.toJavaUtil();
}

4
@ পলরুনি আমি এটি মনে করি না। Nullableতারা কথা বলছি সম্পর্কে সেখানে হবে বলে মনে হয় javax.annotationনা java.util
জোসেফ সিবল-রিইনস্টেট মনিকা

3
আমি ভাবছি যদি এটি কেবল একটি অদ্ভুত জাভা-সিনট্যাক্স-ইএসএম হয়। বিশেষত, এটি কি মূলত বোঝাতে পারে public static <T> @Nullable java.util.Optional<T> toJavaUtilতবে জাভা আপনাকে কেবল সেভাবে লিখতে দেয় না?
জোসেফ সিবিল-রিইনস্টেট মনিকা

1
@ জোসেফসিবল public static <T> @Nullable java.util.Optional<T> toJavaUtilসত্যই সম্ভব নয়, তবে Optionalআমদানি ইতিমধ্যে উপস্থিত থাকলে এর এফকিউএন ব্যবহার করার কোনও কারণ নেই।
টম

6
@ টম এর আরও Optionalএকটি সুযোগ আছে।
জোসেফ সিবল-রিইনস্টেট মনিকা

2
ধন্যবাদ ছেলেরা, আমি এটি চেকার ফ্রেমওয়ার্কে পেয়েছি। @Nullable java.util.List The correct Java syntax to write an annotation on a fully-qualified type name is to put the annotation on the simple name part, as in java.util.@Nullable List. But, it’s usually better to add import java.util.List to your source file, so that you can just write @Nullable List.
সেটডেমোন

উত্তর:


37

লাইনটি public static <T> java.util.@Nullable Optional<T> toJavaUtilএভাবে লেখা হয়, কারণ সাধারণ স্টাইলটি public static <T> @Nullable java.util.Optional<T> toJavaUtilঅবৈধ। এটি জেএলএস -9.7.4 এ সংজ্ঞায়িত করা হয়েছে :

এটি টাইপ টি-এর একটি টীকা প্রকারের প্রসঙ্গে একটি প্রকারের (বা কোনও ধরণের কোনও অংশ) ক্ষেত্রে প্রযোজ্য এবং এটি টাইপ প্রসঙ্গে প্রযোজ্য, এবং টীকাটি গ্রহণযোগ্য নয়।

উদাহরণস্বরূপ, এনোটেশন টাইপ টিএ ধরে নিন যা কেবলমাত্র মেটা-টীকাযুক্ত @Target(ElementType.TYPE_USE)। শর্তাদি @TA java.lang.Objectএবং java.@TA lang.Objectঅবৈধ কারণ @ টিটিএর নিকটতম সরল নামটি প্যাকেজের নাম হিসাবে শ্রেণিবদ্ধ করা হয়েছে। অন্যদিকে, java.lang.@TA Objectআইনী।

প্রকারের ঘোষণাটি org.checkerframework.checker.nullness.qual@Nullableহ'ল:

@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})

সুতরাং এটি এই বিধি প্রয়োগ করা হয়।

যেহেতু এই কাঠামোটি কার্যকরভাবে বিরতি দেয় না, যেহেতু প্যাকেজ java.utilএবং শ্রেণীর নাম Optionalবিভক্ত ছিল, আমরা যখন সংকলিত কোডটি ব্যবহার করে এটি ব্যবহার করি তখন দেখা যায় javap -c [compiled class name]:

class just.a.test.Main {
  just.a.test.Main();
    Code:
       0: aload_0
       1: invokespecial #1          // Method java/lang/Object."<init>":()V
       4: return

  public static <T> java.util.Optional<T> toJavaUtil(blub.Optional<T>);
    Code:
       0: aload_0
       1: ifnonnull     8
       4: aconst_null
       5: goto          12
       8: aload_0
       9: invokevirtual #2          // Method blub/Optional.toJavaUtil:()Ljava/util/Optional;
      12: areturn
}

( blub.Optionalএটি একটি স্থানীয় শ্রেণি যেখানে আমি পেয়ারা কোডটি অনুলিপি করেছিলাম, যাতে নূন্যতম / উদাহরণটি সংক্ষিপ্তকরণের জন্য ন্যূনতম উদাহরণ পেতে পারে)

আপনি দেখতে পাচ্ছেন যে টীকাটির আর অস্তিত্ব নেই। পদ্ধতিটি বাতিল হয়ে গেলে (এবং উত্স কোড পাঠকদের জন্য একটি ইঙ্গিত) যখন সংকলনটি কেবল তখনই একটি সতর্কতা প্রতিরোধ করে তা চিহ্নিতকারী, তবে এটি সংকলিত কোডে অন্তর্ভুক্ত করা হবে না।


এই সংকলক ত্রুটিটি ভেরিয়েবলগুলিতেও প্রযোজ্য:

private @Nullable2 java.util.Optional<?> o;

কিন্তু ElementType.FIELDএকই জেএলএস ধারাতে লিখিত হিসাবে টিকাটি অতিরিক্তভাবে লক্ষ্য প্রকারটি পায় তখন গ্রহণযোগ্য হয়ে উঠতে পারে :

যদি টিএ অতিরিক্তভাবে মেটা-টীকাযুক্ত হয় @Target(ElementType.FIELD)তবে শব্দটি @TA java.lang.Objectএমন জায়গাগুলিতে আইনী যা উভয় ঘোষণা এবং টাইপ প্রসঙ্গ যেমন ক্ষেত্রের ঘোষণার মতো @TA java.lang.Object f;। এখানে, টিটিএ f এর ঘোষণাপত্রের (এবং জাভা.লাং.অবজেক্ট টাইপের ক্ষেত্রে নয়) প্রযোজ্য বলে মনে করা হচ্ছে কারণ ক্ষেত্রের ঘোষণার প্রসঙ্গে টিএ প্রযোজ্য।


11

টীকাগুলি ব্যবহার করার সময়, এই সিনট্যাক্সটি ব্যবহার করা হয় যখন আপনি এই ধরণের জন্য পুরোপুরি যোগ্য নাম লিখতে চান, আমদানির বিবৃতি যোগ না করে।

চেকার ফ্রেমওয়ার্ক ম্যানুয়াল থেকে উদ্ধৃতি :

সম্পূর্ণরূপে যোগ্য টাইপ নামের উপর একটি টীকা লিখতে সঠিক জাভা বাক্য গঠনটি জাভা.ইটিল হিসাবে যেমন সরল নামের অংশে টীকাটি দেওয়া হয় @ তবে, সাধারণত আপনার উত্স ফাইলে java.util.List আমদানি করা ভাল so যাতে আপনি কেবল @ নালাগুলি তালিকা লিখতে পারেন।

এটি JSR308 নির্দিষ্টকরণের পৃষ্ঠা 2 এও উল্লেখ করা হয়েছে যা এখানে ডাউনলোড করা যায় । এটা বলে:

@ নননুল স্ট্রিং বা জাভা.লাংয়ের মতো টাইপের সাধারণ নামের আগে একটি প্রকারের টীকাগুলি উপস্থিত হয় @ @ নননুল স্ট্রিং।


6

এখানে আশ্চর্যের বিষয়টি হ'ল সত্য-বর্ণিত ElementType.TYPE_USEটিকাটি প্রয়োগের জন্য অপরিচিত সিনট্যাক্স । আপনি যদি নল'র ডকগুলি পরীক্ষা করেন তবে আপনি অপরিচিত টার্গেটটি দেখতে পাবেন:

...
@Target(value={TYPE_USE,TYPE_PARAMETER})
<public @interface Nullable
...

এই টীকাটি নীচের দুটির মতোই টীকাযুক্ত প্রকারের সাধারণ নামের ঠিক আগে ব্যবহৃত হয়:

public static <T> @Nullable Optional<T> toJavaUtil
public static <T> java.util.@Nullable Optional<T> toJavaUtil

এই ধরণের টার্গেটের ব্যবহার কী তা আমি জানতাম না, তাই দ্রুত পড়ার পরে আমি এই সাধারণ উদাহরণটি পেয়েছি, যা লক্ষ্যটি রয়েছে এমন একটি টিকা ব্যবহার করে রিটার্ন টাইপ মেটাডেটা তুলেছে:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE_USE)
@interface InterceptedReturnValue {
    boolean value() default true;
}

এবং এটি ব্যবহার করে প্রক্রিয়া করা:

public java.lang.@InterceptedReturnValue(true) String testMethod(String param) {
    return null;
}

public @InterceptedReturnValue(false) String testMethod(int param) {
    return null;
}

public static void main(String[] args) throws Exception {
    Method m = Main.class.getDeclaredMethod("testMethod", String.class);
    if(m.getAnnotatedReturnType().isAnnotationPresent(InterceptedReturnValue.class)) {
        InterceptedReturnValue config = m.getAnnotatedReturnType()
                .getAnnotation(InterceptedReturnValue.class);

        if(config.value()) {
            //logging return value enabled
        }
    }
}

আমি নিশ্চিত যে অনেক কার্যকর কাঠামো যেমন চেকস্প্রেমওয়ার্ক, সবচেয়ে উপযুক্ত ব্যবহার করে ElementType.TYPE_USE

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