在Java中,String.valueOf(Object)和之间有什么区别Object.toString()吗?这些是否有特定的代码约定?
Kub*_*czy 160
根据Java文档,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
}
Run Code Online (Sandbox Code Playgroud)
Shi*_*rma 16
String.valueOf(Object)和Object.toString()之间的区别是:
1) 如果string为null,
String.valueOf(Object)将打印null而Object.toString()将抛出空指针异常.
public static void main(String args[]){
String str = null;
System.out.println(String.valueOf(str)); // it will prints null
System.out.println(str.toString()); // it will throw NullPointer Exception
}
Run Code Online (Sandbox Code Playgroud)
2)签名:
String类的valueOf()方法是静态的.而String类的toString()方法是非静态的.
string的valueOf()方法的签名或语法如下:
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)
Run Code Online (Sandbox Code Playgroud)
string的toString()方法的签名或语法如下:
public String toString()
Run Code Online (Sandbox Code Playgroud)
Ste*_*n C 12
在Java中,String.valueOf(Object)和Object.toString()之间有什么区别吗?
是.
正如javadoc所解释的那样,String.valueOf((Object) null)将被视为特殊情况,而valueOf只会给你一个NPE.
这些是否有特定的代码约定?
没有.
使用哪种最适合您使用它的上下文的要求.(你需要格式化"null"吗?)
注意:这不是代码约定.这只是常识编程.更重要的是,您的代码是正确的,而不是遵循一些风格约定或"最佳实践"教条.
个人意见:
一些开发人员获得了(IMO)对"空"进行"防御"的坏习惯.因此,您会看到许多空值测试,并将空值视为特殊情况.这个想法似乎阻止了NPE的发生.
我认为这是一个坏主意.特别是,我认为如果你找到的null.toString()是你要做的就是"做好"而不考虑为什么会有这样的做法,这是一个坏主意String.valueOf(null).
一般来说,最好避免String.valueOf首先出现在那里......除非String.valueOf(Object)在您的应用程序或API设计中具有非常特定的含义.因此,不要避免使用大量防御性编码的NPE,最好让NPE发生,然后追踪并修复String.valueOf(char[])触发NPE 的意外源.
那么这在这里有什么用呢?
好吧,如果你考虑一下,使用String.valueOf(null) 可能是一种"做好事"的方式.这是要避免的.如果是意外的null是char[]在上下文,它是更好地使用Object.
大多数已经被其他答案提到了,但我只是为了完整性而添加它:
.toString()因为它们不是Object-class的实现,所以只能String.valueOf使用。String.valueOf会将给定的对象转换为nullString "null",而.toString()将抛出NullPointerException.String.valueOf当使用like 时,编译器将默认String s = "" + (...);使用。这就是为什么Object t = null; String s = "" + t;会导致 String "null",而不是 NPE 。StringBuilder.append,而不是String.valueOf。所以忽略我这里所说的。除此之外,这里实际上是一个用例,其中String.valueOf和.toString()具有不同的结果:
假设我们有一个这样的通用方法:
public static <T> T test(){
String str = "test";
return (T) str;
}
Run Code Online (Sandbox Code Playgroud)
我们将用一个称之为Integer类型是这样的:Main.<Integer>test()。
当我们用String.valueOf它创建一个字符串时,它工作正常:
String s1 = String.valueOf(Main.<Integer>test());
System.out.println(s1);
Run Code Online (Sandbox Code Playgroud)
这将输出test到 STDOUT。
随着.toString()但是,它不会工作:
String s2 = (Main.<Integer>test()).toString();
System.out.println(s2);
Run Code Online (Sandbox Code Playgroud)
这将导致以下错误:
java.lang.ClassCastException: classjava.lang.String不能强制转换为 classjava.lang.Integer
至于为什么,我可以参考这个分开的问题及其答案。简而言之:
.toString(),它将首先编译和评估对象,其中转换为T(在这种情况下为Stringto 转换Integer)将导致ClassCastException.String.valueOf它会在编译期间看到泛型T,Object甚至不关心它是Integer. 所以它会投射Object到Object(编译器会忽略)。然后它将使用String.valueOf(Object),从而产生String预期的结果。因此,即使String.valueOf(Object)将.toString()在内部对参数执行 a ,我们已经跳过了强制转换并将其视为 an Object,因此我们避免ClassCastException了使用.toString().只是认为值得一提的是这里String.valueOf和.toString()这里之间的额外区别。
| 归档时间: |
|
| 查看次数: |
69690 次 |
| 最近记录: |