জাভাতে, String.valueOf(Object)এবং এর মধ্যে কোনও পার্থক্য আছে Object.toString()কি? এগুলির জন্য কি কোনও নির্দিষ্ট কোড কনভেনশন রয়েছে?
nullপ্রথমটি যাচাই করে তা বাদ দেয় does
জাভাতে, String.valueOf(Object)এবং এর মধ্যে কোনও পার্থক্য আছে Object.toString()কি? এগুলির জন্য কি কোনও নির্দিষ্ট কোড কনভেনশন রয়েছে?
nullপ্রথমটি যাচাই করে তা বাদ দেয় does
উত্তর:
জাভা ডকুমেন্টেশন অনুসারে , 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
}
String.valueOf(null), এটি একটি এনপিই। এটি কেবল শূন্য হয়ে যাওয়া বস্তুর জন্য কাজ করে।
String.valueOf(null)আসলে সমাধান করা valueOf(char[])জমিদার। এটি কারণের char[]চেয়ে আরও নির্দিষ্ট ধরণের Object।
স্ট্রিং.ভেলুওফ (অবজেক্ট) এবং অবজেক্ট. টো স্ট্রিং () এর মধ্যে পার্থক্যগুলি হ'ল:
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()
জাভাতে, স্ট্রিং.ভ্যালুওফ (অবজেক্ট) এবং অবজেক্ট. টো স্ট্রিং () এর মধ্যে কি কোনও পার্থক্য রয়েছে?
হ্যাঁ. (এবং আরও তাই যদি আপনি ওভারলোডিং বিবেচনা করেন!)
জাভাডোক যেমন ব্যাখ্যা করেছেন, পদ্ধতি String.valueOf((Object) null)দ্বারা একটি বিশেষ কেস হিসাবে বিবেচিত হবে valueOfএবং মানটি "null"ফিরে আসবে। বিপরীতে, null.toString()কেবল আপনাকে একটি এনপিই দেবে।
এটা পরিনত হয় যে String.valueOf(null)(পার্থক্য করে মনে রাখবেন!) করে একটি NPE দিতে ... javadoc সত্ত্বেও। ব্যাখ্যাটি অস্পষ্ট:
এখানে প্রচুর ওভারলোড রয়েছে String.valueOfতবে এখানে দুটি প্রাসঙ্গিক রয়েছে: String.valueOf(Object)এবং String.valueOf(char[])।
অভিব্যক্তিটিতে String.valueOf(null), এই ওভারলোডগুলি উভয়ই প্রযোজ্য , যেহেতু nullকোনও রেফারেন্স টাইপের সাথে অ্যাসাইনমেন্টটি উপযুক্ত।
যখন দুটি বা ততোধিক প্রযোজ্য ওভারলোড থাকে, জেএলএস বলে যে সর্বাধিক নির্দিষ্ট যুক্তির ধরণের জন্য ওভারলোডটি বেছে নেওয়া হয়।
যেহেতু char[]এর একটি উপপ্রকার Object, এটি আরও নির্দিষ্ট ।
অতএব String.valueOf(char[])ওভারলোড বলা হয়।
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()।
বেশিরভাগ ইতিমধ্যে অন্যান্য উত্তর দ্বারা উল্লেখ করা হয়েছে, তবে আমি কেবল এটি সম্পূর্ণতার জন্য যুক্ত করেছি:
.toString()কারণ তারা Objectক্লাসের বাস্তবায়ন নয় , তাই কেবল String.valueOfব্যবহার করা যেতে পারে।String.valueOfএকটি প্রদত্ত বস্তু যে রূপান্তরিত হবে nullস্ট্রিং থেকে "null", যেহেতু .toString()একটি নিক্ষেপ করা হবে NullPointerException।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)।
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();
}
সবচেয়ে গুরুত্বপূর্ণ পার্থক্যটি হল যেভাবে তারা নাল স্ট্রিং রেফারেন্সগুলি পরিচালনা করে।
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
দুটি পদ্ধতির মধ্যে আরও একটি প্রধান পার্থক্য হ'ল যখন আমরা যে বস্তুটিকে রূপান্তর করছি সেটি অ্যারে হয়।
আপনি যখন অবজেক্ট.টোস্ট্রিং () ব্যবহার করে কোনও অ্যারে রূপান্তর করবেন তখন আপনি এক ধরণের আবর্জনার মান পাবেন (@ অ্যারের হ্যাশকোড অনুসরণ করবে)।
স্ট্রিং () থেকে মানব-পঠনযোগ্য পাওয়ার জন্য আপনাকে অবশ্যই স্ট্রিং.ভ্যালুওফ (চর []) ব্যবহার করতে হবে; plz নোট করুন যে এই পদ্ধতিটি কেবল প্রকারের অ্যারের জন্য কাজ করে। অ্যারেগুলিকে স্ট্রিংয়ে রূপান্তর করার জন্য আমি অ্যারেস টু স্ট্রিং (অবজেক্ট []) ব্যবহার করার পরামর্শ দেব।
দ্বিতীয় পার্থক্যটি হল যখন বস্তুটি নাল হয়, ভ্যালুওফ () একটি স্ট্রিংকে "নাল" দেয়, যখন ট্যাস্ট্রিং () নাল পয়েন্টার ব্যতিক্রমটি প্রত্যাবর্তন করে।
পার্থক্যটি ঠিক কী তা আমি বলতে পারি না তবে বাইট স্তরে অপারেশন করার সময় একটি তফাত দেখা দেয়। নিম্নলিখিত এনক্রিপশন দৃশ্যে অবজেক্ট.টোস্ট্রিং () এমন একটি মান তৈরি করেছে যা ডিক্রিপ্ট করা যায়নি যেখানে স্ট্রিং.ভালিউওফ () উদ্দেশ্য হিসাবে কাজ করেছিল ...
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()। তবে যেভাবেই হোক না কেন , এই উত্তরটি অ্যাপ্রোপস নয় কারণ আপনি যে প্রশ্নটি জিজ্ঞাসা করছেন তার কাছে আপনি আলাদা ওভারলোড বলছেন।
নীচে 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);
}
String.valueOfব্যবহৃত হয়। স্ট্রিং-এ ওভাররাইড করে এমন অবজেক্টের জন্য, আমি মনে করি স্ট্রিং.ভ্যালুওফ এর পরিবর্তে কল করতে পারে। যদিও অংশ সম্পর্কে নিশ্চিত না।