স্ট্রিং.ভেলিউওফ () বনাম অবজেক্ট.টো স্ট্রিং ()


132

জাভাতে, String.valueOf(Object)এবং এর মধ্যে কোনও পার্থক্য আছে Object.toString()কি? এগুলির জন্য কি কোনও নির্দিষ্ট কোড কনভেনশন রয়েছে?


10
আদিম ধরণেরগুলিতে "টু স্ট্রিং" নেই .. তাই String.valueOfব্যবহৃত হয়। স্ট্রিং-এ ওভাররাইড করে এমন অবজেক্টের জন্য, আমি মনে করি স্ট্রিং.ভ্যালুওফ এর পরিবর্তে কল করতে পারে। যদিও অংশ সম্পর্কে নিশ্চিত না।
ব্র্যান্ডন

@ ব্র্যান্ডন আপনি সঠিক, এটি nullপ্রথমটি যাচাই করে তা বাদ দেয় does
আজুরফ্রোগ

আমি এখানে প্রথম মন্তব্যটি মনে করি এটি সঠিক হলে সর্বাধিক বোধ করা যায়। লক্ষ্যটি একটি আদিম ধরণের যেখানে আপনাকে অবশ্যই কিছু পরিস্থিতিতে স্ট্রিং.ভ্যালুওফ ব্যবহার করতে হবে।
Donato

উত্তর:


177

জাভা ডকুমেন্টেশন অনুসারে , String.valueOf()আয়:

যদি আর্গুমেন্টটি হয় nullতবে তারপরে একটি স্ট্রিং "null"; অন্যথায়, এর মান obj.toString()ফিরে আসে।

সুতরাং অতিরিক্ত পদ্ধতির প্রার্থনা বাদে সত্যই কোনও পার্থক্য থাকা উচিত নয়।

এছাড়াও, ক্ষেত্রে Object#toString, যদি উদাহরণস্বরূপ হয় null, একটি NullPointerExceptionনিক্ষিপ্ত হবে, তাই তর্কসাপেক্ষ, কম নিরাপদ

public static void main(String args[]) {  
    String str = null;
    System.out.println(String.valueOf(str));  // This will print a String equal to "null"        
    System.out.println(str.toString()); // This will throw a NullPointerException
} 

6
এটি সেরা উত্তর। কোডটি নয়, জাভাদোকগুলি পড়ুন এবং তার উপর নির্ভর করুন। (জাভা বিভিন্ন সংস্করণ / প্রকাশের জন্য কোড নীতিগতভাবে ভিন্ন হতে পারে।)
স্টিফেন সি

7
@ ব্র্যান্ডন - ভুল। এটি কেবল তখনই পরিবর্তন করতে হবে যদি আচরণটি এমনভাবে পরিবর্তিত হয় যা জাভাদোককে অবৈধ করে দেয়। 1) এই পদ্ধতির জন্য যে হওয়ার সম্ভাবনা হ'ল জিরো। তারা একটি পরিবর্তন বৈশিষ্ট পরিবর্তন warranted করা হবে না, এবং তারপর তারা যদি তারা করেনি হবে বৈশিষ্ট পরিবর্তন করুন। 2) এটি আমার পরামর্শকে অকার্যকর করে না। যদি আপনি জাভাদোকটি পড়েন তবে দেখবেন নথিভুক্ত আচরণ বদলেছে!
স্টিফেন সি

2
ব্যতিক্রমটি ছুঁড়ে দেওয়ার পদ্ধতিটি কি আরও নিরাপদ হবে না? সাধারণত, যখন আপনার কোড নালপয়েন্টার এক্সসেপশন ছুড়ে দেয়, এটি ভাল জিনিস thing এই মুহুর্তে এটি বিকাশকারীকে ভাল লাগবে না ("ওহ, না, এখন আমার ফিরে যেতে হবে এবং আমার কোডটি ঠিক করা দরকার") তবে ত্রুটিটি নিক্ষেপ করার পরে আপনি খুঁজে পেয়েছিলেন যে কোনও কিছু ঠিক করার দরকার আছে। অন্যভাবে, আপনি "নাল" সরাসরি ব্যবহারকারীর সামনে প্রকাশ করছেন এবং যদি আপনি স্পষ্টভাবে একটির জন্য অনুসন্ধান করেন না, তবে এটি আমার কাছে কম নিরাপদ বলে মনে হচ্ছে ততক্ষণ কোনও ত্রুটির খবর পাওয়া যাচ্ছে না।
টিম এম

1
কেবল পরিষ্কার করার জন্য, আপনি আসলে কল করতে পারবেন না String.valueOf(null), এটি একটি এনপিই। এটি কেবল শূন্য হয়ে যাওয়া বস্তুর জন্য কাজ করে।
নুমেনন

1
এটি ব্যাখ্যা নয়। String.valueOf(null)আসলে সমাধান করা valueOf(char[])জমিদার। এটি কারণের char[]চেয়ে আরও নির্দিষ্ট ধরণের Object
স্টিফেন সি

17

স্ট্রিং.ভেলুওফ (অবজেক্ট) এবং অবজেক্ট. টো স্ট্রিং () এর মধ্যে পার্থক্যগুলি হ'ল:

1) স্ট্রিং যদি নাল হয়,

String.valueOf(Object)ফিরে আসবে null, যেখানে Object::toString()নাল পয়েন্টার ব্যতিক্রম ছুঁড়ে ফেলবে।

public static void main(String args[]){  
    String str = null;

    System.out.println(String.valueOf(str));  // it will print null        
    System.out.println(str.toString()); // it will throw NullPointerException        
}  

2) স্বাক্ষর:

স্ট্রিং ক্লাসের মানOf () পদ্ধতিটি অচল। তবে স্ট্রিং ক্লাসের টস স্ট্রিং () পদ্ধতিটি অচল।

স্ট্রিংয়ের মান ওফ () পদ্ধতির স্বাক্ষর বা সিনট্যাক্স নীচে দেওয়া হয়েছে:

public static String valueOf(boolean b)  
public static String valueOf(char c)  
public static String valueOf(char[] c)  
public static String valueOf(int i)  
public static String valueOf(long l)  
public static String valueOf(float f)  
public static String valueOf(double d)  
public static String valueOf(Object o)

স্ট্রিংয়ের toString()পদ্ধতির স্বাক্ষর বা সিনট্যাক্স নীচে দেওয়া হয়েছে:

public String toString()

13

জাভাতে, স্ট্রিং.ভ্যালুওফ (অবজেক্ট) এবং অবজেক্ট. টো স্ট্রিং () এর মধ্যে কি কোনও পার্থক্য রয়েছে?

হ্যাঁ. (এবং আরও তাই যদি আপনি ওভারলোডিং বিবেচনা করেন!)

জাভাডোক যেমন ব্যাখ্যা করেছেন, পদ্ধতি String.valueOf((Object) null)দ্বারা একটি বিশেষ কেস হিসাবে বিবেচিত হবে valueOfএবং মানটি "null"ফিরে আসবে। বিপরীতে, null.toString()কেবল আপনাকে একটি এনপিই দেবে।

ওভারলোডিং

এটা পরিনত হয় যে String.valueOf(null)(পার্থক্য করে মনে রাখবেন!) করে একটি NPE দিতে ... javadoc সত্ত্বেও। ব্যাখ্যাটি অস্পষ্ট:

  1. এখানে প্রচুর ওভারলোড রয়েছে String.valueOfতবে এখানে দুটি প্রাসঙ্গিক রয়েছে: String.valueOf(Object)এবং String.valueOf(char[])

  2. অভিব্যক্তিটিতে String.valueOf(null), এই ওভারলোডগুলি উভয়ই প্রযোজ্য , যেহেতু nullকোনও রেফারেন্স টাইপের সাথে অ্যাসাইনমেন্টটি উপযুক্ত।

  3. যখন দুটি বা ততোধিক প্রযোজ্য ওভারলোড থাকে, জেএলএস বলে যে সর্বাধিক নির্দিষ্ট যুক্তির ধরণের জন্য ওভারলোডটি বেছে নেওয়া হয়।

  4. যেহেতু char[]এর একটি উপপ্রকার Object, এটি আরও নির্দিষ্ট

  5. অতএব String.valueOf(char[])ওভারলোড বলা হয়।

  6. String.valueOf(char[])একটি এনপিই নিক্ষেপ করে যদি তার যুক্তিটি নাল অ্যারে হয়। বিপরীতে String.valueOf(Object), এটি nullএকটি বিশেষ কেস হিসাবে বিবেচনা করে না ।

(আপনি কল javap -cরয়েছে এমন কোনও পদ্ধতির কোড পরীক্ষা করে এটি নিশ্চিত করতে পারেন String.valueOf(null)the কলটির জন্য ব্যবহৃত ওভারলোডটি লক্ষ্য করুন))

আর একটি উদাহরণ valueOf(char[])ওভারলোডের পার্থক্যটিকে আরও স্পষ্টভাবে চিত্রিত করে :

char[] abc = new char[]('a', 'b', 'c');
System.out.println(String.valueOf(abc));  // prints "abc"
System.out.println(abc.toString());       // prints "[C@...."

এর জন্য কি কোনও নির্দিষ্ট কোড কনভেনশন রয়েছে?

না।

আপনি যে প্রসঙ্গে এটি ব্যবহার করছেন সেই প্রয়োজনীয়তার প্রয়োজনীয়তার জন্য যা সবচেয়ে বেশি উপযুক্ত তা ব্যবহার করুন। ( কাজ করার জন্য আপনার কি ফর্ম্যাটিং দরকারnull ?)

দ্রষ্টব্য: এটি কোনও কোড কনভেনশন নয়। এটি কেবল সাধারণ জ্ঞানের প্রোগ্রামিং। আপনার কোডটি কিছু স্টাইলিস্টিক কনভেনশন বা "সেরা অনুশীলন" ডগমা অনুসরণ করার চেয়ে সঠিক যেটি গুরুত্বপূর্ণ ।


নিজের মতামত:

কিছু বিকাশকারী নালীর বিরুদ্ধে "ডিফেন্ডিং" করার (আইএমও) খারাপ অভ্যাস অর্জন করে। সুতরাং আপনি নালগুলির জন্য প্রচুর পরীক্ষা দেখতে পাচ্ছেন এবং নলগুলি বিশেষ ক্ষেত্রে হিসাবে চিকিত্সা করছেন। ধারণাটি এনপিইর ঘটনা থেকে আটকাচ্ছে বলে মনে হচ্ছে।

আমি মনে করি এটি একটি খারাপ ধারণা। বিশেষত, আমি মনে করি এটি খারাপ ধারণা বলে মনে হয় আপনি যখন যা পেয়েছেন তা যদি null"ভাল" করার চেষ্টা করা হয় ... সেখানে কেন আছে তা বিবেচনা না করেই null

সাধারণভাবে, nullপ্রথমে সেখানে থাকা এড়ানো ভাল ... যদি nullনা আপনার অ্যাপ্লিকেশন বা এপিআই ডিজাইনের সুনির্দিষ্ট অর্থ না থাকে। সুতরাং, প্রচুর পরিমাণে ডিফেন্সিভ কোডিং দিয়ে এনপিকে এড়িয়ে চলার পরিবর্তে এনপিই হ'ল আরও ভাল, এবং তারপরে ট্র্যাক ডাউন nullকরে এনপিইকে উদ্দীপ্তকারী অপ্রত্যাশিত উত্সটি ঠিক করতে ।

তাহলে এটি এখানে কীভাবে প্রযোজ্য?

ঠিক আছে, আপনি যদি এটির বিষয়ে চিন্তা করেন তবে ব্যবহার করা "উপার্জন" করার একটি উপায় String.valueOf(obj) হতে পারে। তা এড়াতে হবে। যদি অপ্রত্যাশিত জন্য objহতে nullপ্রসঙ্গে, এটা ব্যবহার করা উত্তম obj.toString()


5

বেশিরভাগ ইতিমধ্যে অন্যান্য উত্তর দ্বারা উল্লেখ করা হয়েছে, তবে আমি কেবল এটি সম্পূর্ণতার জন্য যুক্ত করেছি:

  1. প্রাইমেটিভগুলির একটি নেই .toString()কারণ তারা Objectক্লাসের বাস্তবায়ন নয় , তাই কেবল String.valueOfব্যবহার করা যেতে পারে।
  2. String.valueOfএকটি প্রদত্ত বস্তু যে রূপান্তরিত হবে nullস্ট্রিং থেকে "null", যেহেতু .toString()একটি নিক্ষেপ করা হবে NullPointerException
  3. সংকলক String.valueOfডিফল্টরূপে ব্যবহার করবে যখন এর মতো String s = "" + (...);কিছু ব্যবহৃত হয়। কোন কারণেই স্ট্রিংয়ের Object t = null; String s = "" + t;ফলাফল হবে "null"এবং এনপিইতে নয়। সম্পাদনা: আসলে, এটি ব্যবহার করবে StringBuilder.append, না String.valueOf। সুতরাং আমি এখানে যা বলেছি তা উপেক্ষা করুন।

ঐ ছাড়াও, এখানে আসলে একটি ব্যবহারের ক্ষেত্রে কোথায় String.valueOfএবং .toString()ভিন্ন ফলাফল আছে:

ধরা যাক আমাদের মতো জেনেরিক পদ্ধতি রয়েছে:

public static <T> T test(){
  String str = "test";
  return (T) str;
}

এবং আমরা তা একটি সঙ্গে ডাকবো Integerভালো টাইপ: Main.<Integer>test()

যখন আমরা String.valueOfএটির সাথে একটি স্ট্রিং তৈরি করি তখন এটি দুর্দান্ত কাজ করে:

String s1 = String.valueOf(Main.<Integer>test());
System.out.println(s1);

এটি testSTDOUT এ আউটপুট দেবে।

একটি সঙ্গে .toString()যাইহোক, এটা কাজ করবে না:

String s2 = (Main.<Integer>test()).toString();
System.out.println(s2);

এটি নিম্নলিখিত ত্রুটির ফলস্বরূপ হবে:

java.lang.ClassCastException: ক্লাসে java.lang.Stringক্লাসে কাস্ট করা যায় নাjava.lang.Integer

এটি অনলাইনে চেষ্টা করুন।

কেন এই হিসাবে, আমি এই পৃথক প্রশ্ন এবং এর উত্তরগুলি উল্লেখ করতে পারি । সংক্ষেপে তবে:

  • যখন ব্যবহার .toString()এটি প্রথম কম্পাইল এবং বস্তুর, যেখানে কাস্ট মূল্যায়ন করবে T(যা একটি হল Stringথেকে Integerএই ক্ষেত্রে ঢালাই) পরিণাম ডেকে আনবে ClassCastException
  • ব্যবহার করার সময় String.valueOfএটা জেনেরিক দেখতে হবে Tযেমন Objectসংকলন করার সময় এবং এমনকি এটি একটি হচ্ছে সম্পর্কে গ্রাহ্য না করে Integer। সুতরাং এটি একটি নিক্ষেপ করা হবে Objectথেকে Object(যা কম্পাইলার শুধু উপেক্ষা করে)। তারপরে এটি ব্যবহার করবে String.valueOf(Object), ফলস্বরূপ Stringপ্রত্যাশিত ফলস্বরূপ । যদিও অভ্যন্তরীণভাবে প্যারামিটারটিতে String.valueOf(Object)উইল একটি কাজ করবে .toString(), আমরা ইতিমধ্যে কাস্ট এবং এটিকে এর মতো ব্যবহার করে এড়িয়ে গিয়েছি Object, তাই আমরা ClassCastExceptionব্যবহারটি ঘটে যা এড়িয়ে চলেছি .toString()

কেবল ভেবেছি এটি এখানে String.valueOfএবং .toString()এখানেও এই অতিরিক্ত পার্থক্যের উল্লেখযোগ্য ।


আমি শেষবারের দিকে যত্ন নিয়েছিলাম, যা জেডিকে ১.২ এর কাছাকাছি হত, যা ("" + x)সংকলিত হয়েছিল String.valueOf(x), তবে আরও জটিল কিছু একটি ব্যবহার করেছিল StringBuffer(আমাদের তখন ছিল না StringBuilder)।
নীল

4

String.valueOf(Object)এবং Object.toString()আক্ষরিক একই জিনিস।

আপনি যদি স্ট্রিং.ভ্যালুওফ (অবজেক্ট) এর বাস্তবায়নটি একবার দেখে থাকেন তবে আপনি দেখতে পাবেন যে String.valueOf(Object)এটি মূলত toString()যথাযথ অবজেক্টের নাল-নিরাপদ প্রার্থনা :

Returns the string representation of the Object argument.

Parameters:
    obj an Object.
Returns:
    if the argument is null, then a string equal to "null"; 
    otherwise, the value of obj.toString() is returned.
See also:
    Object.toString()

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

সত্য নয়, একটি চরের অ্যারেতে মান ওফ এবং টু স্ট্রিং উভয় ব্যবহার করুন এবং আপনার চোখ ভোজ দিন।
আর্টানিস

3

সবচেয়ে গুরুত্বপূর্ণ পার্থক্যটি হল যেভাবে তারা নাল স্ট্রিং রেফারেন্সগুলি পরিচালনা করে।

String str = null;
System.out.println("String.valueOf gives : " + String.valueOf(str));//Prints null
System.out.println("String.toString gives : " + str.toString());//This would throw a NullPointerExeption

1

যখন যুক্তিটি হয় null, String.valueOfফিরে আসে "null", কিন্তু Object.toStringছোঁড়ে NullPointerException, তবে এটিই কেবল পার্থক্য।


0

দুটি পদ্ধতির মধ্যে আরও একটি প্রধান পার্থক্য হ'ল যখন আমরা যে বস্তুটিকে রূপান্তর করছি সেটি অ্যারে হয়।

আপনি যখন অবজেক্ট.টোস্ট্রিং () ব্যবহার করে কোনও অ্যারে রূপান্তর করবেন তখন আপনি এক ধরণের আবর্জনার মান পাবেন (@ অ্যারের হ্যাশকোড অনুসরণ করবে)।

স্ট্রিং () থেকে মানব-পঠনযোগ্য পাওয়ার জন্য আপনাকে অবশ্যই স্ট্রিং.ভ্যালুওফ (চর []) ব্যবহার করতে হবে; plz নোট করুন যে এই পদ্ধতিটি কেবল প্রকারের অ্যারের জন্য কাজ করে। অ্যারেগুলিকে স্ট্রিংয়ে রূপান্তর করার জন্য আমি অ্যারেস টু স্ট্রিং (অবজেক্ট []) ব্যবহার করার পরামর্শ দেব।

দ্বিতীয় পার্থক্যটি হল যখন বস্তুটি নাল হয়, ভ্যালুওফ () একটি স্ট্রিংকে "নাল" দেয়, যখন ট্যাস্ট্রিং () নাল পয়েন্টার ব্যতিক্রমটি প্রত্যাবর্তন করে।


হাই @ টম এটি যে কোনও ধরণের অ্যারের জন্য সত্য, তবে আপনি যদি অ্যারে.টো স্ট্রিং (অবজেক্ট []) ব্যবহার করেন তবে আপনি যে কোনও ধরণের অ্যারেটিকে স্ট্রিংয়ে রূপান্তর করতে পারেন।
চিন্তান ঠাকর

হাই @ টম অবজেক্ট.টো স্ট্রিং () কোনও আবর্জনার মান ফিরিয়ে দেওয়া যে কোনও ধরণের অ্যারের পক্ষে সত্য, আপনি ঠিক বলেছেন যে স্ট্রিং.ভ্যালুওফ (অ্যারে) কেবল চর ধরণের অ্যারের জন্য একটি সঠিক স্ট্রিং দেবে। আমার এটি উল্লেখ করা উচিত ছিল, ধন্যবাদ, আমি এটি সম্পাদনা করব।
চিন্তান ঠককর

1
এটা একটা আবর্জনা মান নয়, এটা classname এবং হ্যাশকোড (হয় JavaDoc )।
টম

-1

পার্থক্যটি ঠিক কী তা আমি বলতে পারি না তবে বাইট স্তরে অপারেশন করার সময় একটি তফাত দেখা দেয়। নিম্নলিখিত এনক্রিপশন দৃশ্যে অবজেক্ট.টোস্ট্রিং () এমন একটি মান তৈরি করেছে যা ডিক্রিপ্ট করা যায়নি যেখানে স্ট্রিং.ভালিউওফ () উদ্দেশ্য হিসাবে কাজ করেছিল ...

private static char[] base64Encode(byte[] bytes) 
{   
    return Base64.encode(bytes);
}

private static String encrypt(String encrypt_this) throws GeneralSecurityException, UnsupportedEncodingException 
{
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES");
    SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD));
    Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES");
    pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20));

     //THIS FAILED when attempting to decrypt the password
    //return base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8"))).toString(); 

    //THIS WORKED
    return String.valueOf(base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8"))));
}//end of encrypt()

কেন ব্যর্থ? সমস্যা কি?
ইউশা আলেয়াউব

ব্যাখ্যাটি হ'ল আপনি valueOf(char[])বরং কল করছেন valueOf(Object)। এর আচরণের সাথে valueOf(char[])উল্লেখযোগ্যভাবে আলাদা char[].toString()। তবে যেভাবেই হোক না কেন , এই উত্তরটি অ্যাপ্রোপস নয় কারণ আপনি যে প্রশ্নটি জিজ্ঞাসা করছেন তার কাছে আপনি আলাদা ওভারলোড বলছেন।
স্টিফেন সি

-2

নীচে jdk8u25 এর উত্সে বর্ণিত হিসাবে java.lang.String.valueOf এর বাস্তবায়ন দেখায়। সুতরাং আমার মন্তব্য অনুসারে, কোনও পার্থক্য নেই। এটি "অবজেক্ট.টোস্ট্রিং" কল করে। আদিম ধরণের জন্য, এটি এটিকে তার অবজেক্ট ফর্মের সাথে আবৃত করে এবং এতে "টু স্ট্রিং" কল করে।

নিচে দেখ:

/*
 * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */


    public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

    public static String valueOf(char data[]) {
        return new String(data);
    }

    public static String valueOf(char data[], int offset, int count) {
        return new String(data, offset, count);
    }

    public static String copyValueOf(char data[], int offset, int count) {
        return new String(data, offset, count);
    }

    public static String copyValueOf(char data[]) {
        return new String(data);
    }

    public static String valueOf(boolean b) {
        return b ? "true" : "false";
    }

    public static String valueOf(char c) {
        char data[] = {c};
        return new String(data, true);
    }

    public static String valueOf(int i) {
        return Integer.toString(i);
    }

    public static String valueOf(long l) {
        return Long.toString(l);
    }

    public static String valueOf(float f) {
        return Float.toString(f);
    }

    public static String valueOf(double d) {
        return Double.toString(d);
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.