2013-01-02 14 views
6

मैं एक जावा ट्यूटोरियल पीछा कर रहा था और यह मेरे जैसे कुछ करना हो रही थी:इंटीजर को प्रिंट करने के बजाय मुझे Integer.toString() का उपयोग क्यों करना चाहिए?

int k = 5; 
System.out.println("The number is " + Integer.toString(k)); 

तो एक अच्छा खेल रहा साथ पीछा किया की तरह है, लेकिन मैं मदद नहीं कर सकता लेकिन आश्चर्य है, क्यों सब पर है कि विधि का उपयोग करें?

int k = 5; 
System.out.println("The number is " + k); 

वहाँ गैर स्ट्रिंग डेटा प्रकार के लिए toString() विधि का उपयोग करने के लिए एक अच्छा कारण है: अतिरिक्त लिखने का बहुत सा रूप में एक ही कार्यक्षमता प्राप्त करने के लिए की तरह लगता है? और मेरे विशिष्ट उदाहरण में, क्या कोई int मान हैं जो ऑटो टूस्टिंग नहीं हो सकते हैं?

+6

वहाँ दोनों के बीच कोई महत्वपूर्ण अंतर है। ट्यूटोरियल जोर दे सकता था कि 'toString' को "कवर के तहत" कहा जाता है, लेकिन, दिन-प्रति-दिन प्रोग्रामिंग के लिए यह केवल अतिरिक्त अव्यवस्था है। –

+1

मैंने पहले से ही एक उत्तर पोस्ट किया है, लेकिन आकस्मिक पाठकों के लिए इंगित करना चाहता था कि ऐसे व्यावहारिक मामले हैं जिनमें आपको * * को * इंटीजर.टोस्ट्रिंग (int) और/या अन्य सुरक्षा उपायों का उपयोग करना चाहिए, जब तत्वों को लंबे समय तक स्ट्रिंग में '+ ऑपरेटर यदि आप सावधान नहीं हैं, तो '+' ऑपरेटर के साथ स्ट्रिंग कॉन्सटेनेशन अनपेक्षित परिणाम उत्पन्न कर सकता है। – rob

उत्तर

15

यह कई "सुरक्षित प्रोग्रामिंग" प्रथाओं आप स्पष्टता में सुधार लाने और सूक्ष्म त्रुटियों जो आप या आपके कोड के भविष्य के मेंटेनर को पेश हो सकता है को रोकने के लिए गोद ले सकते हैं में से एक है। निम्न उदाहरण लें:

private static void printMessage(int k) { 
    System.out.println("number" + '=' + k); 
} 

उत्पादन: number=5

अब आप पिछले संख्या पहले और पाठ मुद्रित करने के लिए चाहते हैं। सभी मैं कर रहा हूँ स्ट्रिंग संयोजन में प्रथम और अंतिम आइटम की अदला-बदली है:

private static void printMessage2(int k) { 
    System.out.println(k + '=' + "number"); 
} 

उत्पादन: 66number

ऊप्स! = का int मान संगत होने की बजाय k में जोड़ा गया था। एक समाधान = को String में बनाना है। एक अन्य समाधान स्पष्ट int एक String कन्वर्ट करने के लिए है:

private static void printMessage2Safe(int k) { 
    System.out.println(Integer.toString(k) + '=' + "number"); 
} 

उत्पादन: 5=number

"ओह, लेकिन मुझे लगता है कि, वैसे भी, कभी नहीं करना चाहते हैं" आप कहते हैं। "किसी भी व्यक्ति ने अपने सही दिमाग में अन्य स्ट्रिंग के = भाग को बनाया होगा।" लेकिन क्या होगा यदि आप मूल कैलक्यूलेटर ऐप का हिस्सा लागू कर रहे हैं, और आप अभिव्यक्ति और इसके परिणाम को आउटपुट करना चाहते हैं? यदि आप वास्तव में सावधान रहने की कोशिश कर रहे हैं, तो मुझे लगता है कि आप अभिव्यक्ति के हिस्सों को संयोजित करने के लिए StringBuilder.append() का उपयोग करेंगे। लेकिन यदि नहीं, तो मुझे उम्मीद है कि आप नीचे display विधि का पहला कार्यान्वयन नहीं लिखेंगे।

public class Calculator { 

    public static void main(String[] args) { 
     display(2, '+', 3, 5); 
     displaySafe(2, '+', 3, 5); 
    } 

    public static void display(int num1, char operator, int num2, int result) { 
     System.out.println(num1 + operator + num2 + '=' + result); 
    } 

    public static void displaySafe(int num1, char operator, int num2, int result) { 
     System.out.println(Integer.toString(num1) + operator + Integer.toString(num2) + "=" + result); 
    } 

} 

उत्पादन:

114 
2+3=5 
+3

ToString का उपयोग करने के कारण का बहुत अच्छा उदाहरण – Mike

5

क्या गैर-स्ट्रिंग डेटा प्रकारों के लिए toString() विधि का उपयोग करने का कोई अच्छा कारण है?

कुछ लोगों का मानना ​​है कि यह स्पष्ट है। शुरुआती लोगों के लिए esp जो महसूस नहीं कर सकते हैं वे मूल रूप से एक ही बात करते हैं।

नोट: जावा में 7 अद्यतन 9, यह स्ट्रिंग का निर्माण नहीं करता पहले के रूप में संलग्न (int) इस

// from AbstractStringBuilder 
public AbstractStringBuilder append(int i) { 
    if (i == Integer.MIN_VALUE) { 
     append("-2147483648"); 
     return this; 
    } 
    int appendedLength = (i < 0) ? Integer.stringSize(-i) + 1 
           : Integer.stringSize(i); 
    int spaceNeeded = count + appendedLength; 
    ensureCapacityInternal(spaceNeeded); 
    Integer.getChars(i, spaceNeeded, value); 
    count = spaceNeeded; 
    return this; 
} 

यह संख्या StringBuilder में स्ट्रेट एक स्ट्रिंग बनाने की आवश्यकता से बचने धर्मान्तरित की तरह दिखता है प्रथम।

और मेरे विशिष्ट उदाहरण में, क्या कोई int मान हैं जो ऑटो टूस्टिंग नहीं हो सकता है?

नहीं। सभी आदिम मूल्यों को स्ट्रिंग किया जा सकता है।

मुझे पता है कि एकमात्र अपवाद signalling and quiet Not-A-Number मान है क्योंकि जावा ऐसी चीजों की परवाह नहीं करता है। दोनों के रूप में "NaN" दिखाई देते हैं और कोई रास्ता नहीं (जावा में या सबसे कार्यों) toString से अंतर() बताने के लिए

+0

लेकिन ध्यान दें कि इन सिग्नल/NaN मानों का उपयोग केवल फ्लोटिंग पॉइंट प्राइमेटिव्स जैसे 'फ्लोट'/'डबल' द्वारा किया जाता है, और 'int' नहीं। – matts

0
System.out.println("The number is " + Integer.toString(k)); 

ऊपर प्रिंट में है "संख्या है"स्ट्रिंग है, इसलिए स्ट्रिंग + (कुछ भी)स्ट्रिंग केवल इसलिए है। इसलिए उस स्थिति में ToString() को कॉल करने की आवश्यकता नहीं है। इसलिए यदि आप केवल के मान को प्रिंट करना चाहते हैं तो तोस्ट्रिंग() को S.O.P इंट्राक्ली कॉल टू स्ट्रिंग() के रूप में कॉल करने की आवश्यकता नहीं है। ।

तो आखिरकार, हम तब तक कह सकते हैं जब तक कि आप इंटीजर से स्ट्रिंग को कन्वर्ट नहीं करना चाहते हैं, आपको toString() विधि को कॉल नहीं करना चाहिए।

-6

यह संख्या को स्ट्रिंग डेटा प्रकार बनने की अनुमति देता है, इसलिए यह सभी एक स्ट्रिंग है। जैसा कि मोब ने कहा था, यह भी शुरू करने के लिए एक पूर्णांक नहीं है। इसे एक पूर्ण होने से पहले इसे एक पूर्णांक में पार्स करना होगा।

+0

इसे इंटीजर होने की आवश्यकता नहीं है, क्योंकि Integer.toString (int) एक इंटीजर की अपेक्षा नहीं करता है। –

+0

और जैसे ही आप तोता जवाब देते हैं, यह गलत है। –

+0

println स्वचालित रूप से इस रूपांतरण को निष्पादित करता है, हम ऐसा करने के लिए नहीं हैं – nobalG

0

दूसरे संस्करण का उपयोग करें। जैसे

"The number is " + k; 

javac स्ट्रिंग concatination भाव के लिए

new StringBuilder("The number is ")).append(Integer.toString(k)).toString()); 

तो System.out के रूप में वास्तविक कोड StringBuilder का उपयोग कर बनाता है।println बस जिसके परिणामस्वरूप स्ट्रिंग प्रिंट, पूर्ण कोड

System.out.println((new StringBuilder("The number is ")).append(Integer.toString(k)).toString()); 
संबंधित मुद्दे