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
@PaRRooney मुझे ऐसा नहीं लगता। Nullableवे बात कर रहे हैं के बारे में वहाँ में हो रहा है javax.annotation, नहीं java.util
जोसेफ सिबल-रिनेटेट मोनिका

3
मुझे आश्चर्य है कि अगर यह सिर्फ एक अजीब जावा-सिंटैक्स-इस्म हो सकता है। विशेष रूप से, यह मूल रूप से मतलब हो सकता है public static <T> @Nullable java.util.Optional<T> toJavaUtil, लेकिन यह जावा सिर्फ आपको इसे लिखने नहीं देता है?
जोसेफ सिबल-रिनेटेट मोनिका

1
@JosephSible public static <T> @Nullable java.util.Optional<T> toJavaUtilवास्तव में संभव नहीं है, लेकिन FQN का उपयोग करने का कोई कारण नहीं है 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अमान्य है। यह JLS This9.7.4 में परिभाषित किया गया है :

यह एक संकलित समय त्रुटि है यदि टाइप T का एनोटेशन एक प्रकार के संदर्भ में (या किसी प्रकार का कोई भाग) पर लागू होता है, और T टाइप संदर्भों में लागू होता है, और एनोटेशन स्वीकार्य नहीं है।

उदाहरण के लिए, एक एनोटेशन प्रकार टीए मानें जो मेटा-एनोटेट है @Target(ElementType.TYPE_USE)। नियम @TA java.lang.Objectऔर java.@TA lang.Objectअवैध हैं क्योंकि @TA के सबसे सरल नाम को पैकेज नाम के रूप में वर्गीकृत किया गया है। दूसरी ओर, 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रूप से लक्ष्य प्रकार प्राप्त करता है , जैसा कि एक ही जेएलएस क्लॉज में लिखा गया है:

यदि TA के साथ अतिरिक्त रूप से मेटा-एनोटेट किया गया है @Target(ElementType.FIELD), तो यह शब्द @TA java.lang.Objectउन स्थानों पर कानूनी है, जो घोषणा और प्रकार दोनों संदर्भ हैं, जैसे कि फ़ील्ड घोषणा @TA java.lang.Object f;। यहाँ, @TA को f (और java.lang.Object प्रकार पर नहीं) के घोषणापत्र पर लागू माना जाता है क्योंकि टीए क्षेत्र घोषणा संदर्भ में लागू होता है।


11

एनोटेशन का उपयोग करते समय, यह वाक्यविन्यास होता है, जिसका उपयोग तब किया जाता है जब आप आयात विवरण जोड़ने के बजाय पूरी तरह से योग्य नाम लिखना चाहते हैं।

परीक्षक फ्रेमवर्क मैनुअल से उद्धरण :

पूरी तरह से योग्य प्रकार के नाम पर एक एनोटेशन लिखने के लिए सही जावा सिंटैक्स को एनोटेशन को सरल नाम वाले हिस्से पर रखना है, जैसा कि java.util। @ Nullable List में। लेकिन, आमतौर पर आयात java.util को अपनी स्रोत फ़ाइल में जोड़ना बेहतर होता है, ताकि आप सिर्फ @ योग्य सूची लिख सकें।

जेएसआर 308 विनिर्देश के पेज 2 पर भी इसका उल्लेख किया गया है जिसे यहां डाउनलोड किया जा सकता है । इसे कहते हैं:

एक प्रकार का एनोटेशन, प्रकार के सरल नाम से पहले प्रकट होता है, जैसा कि @NonNull स्ट्रिंग या java.lang में है। @ NonNull स्ट्रिंग।


6

अजीब सा यहाँ वास्तव में एक अपरिचित वाक्यविन्यास लागू करने के लिए अपरिचित वाक्यविन्यास है ElementType.TYPE_USE। यदि आप Nullable के डॉक्स की जांच करते हैं , तो आपको अपरिचित लक्ष्य दिखाई देगा:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.