Java 为什么要把一根绳子换成一根绳子?
Oracle Java社区站点上的一篇文章给出了以下方法作为示例(对于JPA转换器,但我想这与此无关):Java 为什么要把一根绳子换成一根绳子?,java,string,Java,String,Oracle Java社区站点上的一篇文章给出了以下方法作为示例(对于JPA转换器,但我想这与此无关): public Boolean convertToEntityAttribute(String y) { String val = (String) y; if(val.equals("Y")){ return true; } else { return false; } } 将字符串y强制转换为字符串val有什么用?这样做有正
public Boolean convertToEntityAttribute(String y) {
String val = (String) y;
if(val.equals("Y")){
return true;
} else {
return false;
}
}
将字符串y强制转换为字符串val有什么用?这样做有正当理由吗
原文:这样的演员阵容完全没有必要。我可以想象那是以前
public Boolean convertToEntityAttribute(Object y) {
String val = (String) y;
...
}
但是后来参数类型被更改为
String
,作者只是忘记了删除强制转换。这个多余的强制转换是无用的
当前代码可以简化为
public Boolean convertToEntityAttribute(String y) {
return "Y".equals(y);
}
这样做有正当理由吗
什么都没有
但另一方面,Java编译器知道类型转换是不必要的,并对其进行了优化。因此,唯一的“损害”是可读性
比如说
[stephen@blackbox tmp]$ cat Test.java
public class Test {
public void test (String x) {
String s = (String) x;
System.out.println(s);
}
}
[stephen@blackbox tmp]$ javac Test.java
[stephen@blackbox 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
}
[stephen@blackbox tmp]$
[stephen@blackboxtmp]$cat Test.java
公开课考试{
公共无效测试(字符串x){
字符串s=(字符串)x;
系统输出打印项次;
}
}
[stephen@blackboxtmp]$javac Test.java
[stephen@blackboxtmp]$javap-c测试
从“Test.java”编译而来
公开课考试{
公开考试();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共无效测试(java.lang.String);
代码:
0:aload_1
1:astore_2
2:getstatic#2//Field java/lang/System.out:Ljava/io/PrintStream;
5:aload_2
6:invokevirtual#3//方法java/io/PrintStream.println:(Ljava/lang/String;)V
9:返回
}
[stephen@blackboxtmp]$
语句strings=(String)x代码>被编译成一个简单的加载和存储;无checkcast
指令
如果JIT编译器能够优化掉冗余的checkcast
。。。如果它看到了
1-。。。手写代码。在生成的源代码中,可以使用冗余类型转换,以便更容易地编写源代码生成器。毕竟,生成代码的可读性在很大程度上是不相关的。return val.equals(“Y”)
就足够了。是的……不需要这种重复的强制转换。像你和我这样的开发人员犯了错误。感谢您的识别:)Tunaki-I'd of write return“Y”。等于(val)整个示例代码都很糟糕。首先,AttributeConverter
需要两个类型参数(正如您所期望的,它们是您从/转换到的两种类型),作者忽略了这两个参数。因此,该示例甚至无法编译。然后是不必要的强制转换,蛋糕上的糖霜是if(boolean){return true;}else{return false;}
construct。请注意,这是另一回事-本文中的代码会在null值上抛出NPE,而这不会。在某些情况下,需要在null值上使用NPE。@eis这两种情况都不会导致NPE,您可以将null强制转换为任何引用类型,而不会得到任何异常@IAN2TEDV,但如果不获得异常,您当然不能在null值上调用val.equals()exception@eis通过此操作,您将无法获得NPE
。你指的是什么?@RuchiraGayanRanaweera你会在原始代码中看到,所以这并不等同于那个。