2015-12-07 13 views
5

ओरेकल जावा समुदाय साइटों पर एक लेख एक उदाहरण के रूप में देता है (एक जेपीए कनवर्टर के लिए, लेकिन यह प्रासंगिक नहीं है, मुझे लगता है) निम्न विधि:स्ट्रिंग को स्ट्रिंग क्यों डाला गया?

public Boolean convertToEntityAttribute(String y) { 
    String val = (String) y; 
    if(val.equals("Y")){ 
     return true; 
    } else { 
     return false; 
    } 
} 

क्या एक करने के लिए स्ट्रिंग y कास्टिंग का प्रयोग होता है स्ट्रिंग वैल? क्या ऐसा करने का कोई वैध कारण है?

मूल लेख: What's New in JPA

+8

'वापसी val.equals (" वाई ")' हाँ पर्याप्त होगा ... – Tunaki

+0

इस अनावश्यक कास्टिंग की आवश्यकता नहीं है। –

+0

ऐसा लगता है कि उन्होंने इंटर्न को उस उदाहरण को लिखने दिया ... – m0skit0

उत्तर

13

इस तरह के कलाकारों को पूरी तरह अनावश्यक है। मैं कल्पना कर सकते हैं कि यह

public Boolean convertToEntityAttribute(Object y) { 
    String val = (String) y; 
    ... 
} 

पहले था लेकिन बाद में तर्क प्रकार String में बदल गया था और लेखक बस संयोजन हटाने भूल गया।

2

यह अनावश्यक कास्टिंग बेकार है।

वर्तमान कोड

public Boolean convertToEntityAttribute(String y) { 
    return "Y".equals(y); 
} 
+3

ध्यान दें कि यह एक अलग बात है - लेख में कोड एनपीई को शून्य मानों पर फेंक देगा, जबकि यह नहीं होगा। कुछ मामलों में, शून्य मूल्यों पर एनपीई वांछित है। – eis

+0

@eis दोनों मामले एनपीई का कारण नहीं बनेंगे, आप बिना किसी अपवाद के किसी भी संदर्भ प्रकार के लिए शून्य डाल सकते हैं http://stackoverflow.com/questions/18723596/no-exception-while-type-casting-with-a-null- इन-जावा – Ian2thedv

+1

@ Ian2thedv लेकिन आप निश्चित रूप से अपवाद प्राप्त किए बिना शून्य मूल्य पर val.equals() को कॉल नहीं कर सकते हैं – eis

3

को आसान बनाने में किया जा सकता है वहाँ यह करने के लिए एक वैध कारण है?

कोई भी ।

लेकिन फ्लिपसाइड यह है कि जावा कंपाइलर जानता है कि टाइपकास्ट अनावश्यक है और इसे अनुकूलित करता है। तो केवल "नुकसान" पठनीयता के लिए है।

उदाहरण के लिए

[[email protected] tmp]$ cat Test.java 
public class Test { 
    public void test (String x) { 
     String s = (String) x; 
     System.out.println(s); 
    } 
} 
[[email protected] tmp]$ javac Test.java 
[[email protected] tmp]$ javap -c Test 
Compiled from "Test.java" 
public class Test { 
    public Test(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public void test(java.lang.String); 
    Code: 
     0: aload_1 
     1: astore_2 
     2: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     5: aload_2 
     6: invokevirtual #3     // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     9: return 
} 
[[email protected] tmp]$ 

बयान String s = (String) x; एक सरल लोड और एक दुकान में संकलित किया गया है; नहीं checkcast निर्देश।

मुझे आश्चर्य नहीं होगा अगर जेआईटी कंपाइलर एक अनावश्यक checkcast को अनुकूलित करने में सक्षम था ... यदि उसने देखा तो।


1 - ... हाथ से लिखित कोड में। स्रोत कोड जो उत्पन्न हुआ था, में एक अनावश्यक टाइपकास्ट स्रोत कोड जेनरेटर लिखना आसान बनाने के उद्देश्य से कार्य किया जा सकता है। आखिरकार, जेनरेट कोड की पठनीयता काफी हद तक अप्रासंगिक है।

संबंधित मुद्दे