为什么Java没有警告= ="某事"?

Mar*_*ius 12 java language-design

这可能听起来很愚蠢,但为什么Java编译器不警告以下if语句中的表达式:

String a = "something";
if(a == "something"){
  System.out.println("a is equal to something");
}else{
  System.out.println("a is not equal to something");
}
Run Code Online (Sandbox Code Playgroud)

我意识到为什么表达式是不真实的,但AFAIK,a永远不能等于String文字"某事".编译器应该意识到这一点,并且至少警告我,我是一个正在深夜编码的白痴.

澄清 这个问题不是关于比较两个String对象变量,而是将String对象变量与String文本进行比较.我意识到以下代码是有用的,并会产生不同的结果.equals():

String a = iReturnAString();
String b = iReturnADifferentString();
if(a == b){
  System.out.println("a is equal to b");
}else{
  System.out.println("a is not equal to b");
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,a和b实际上可能指向内存中的相同区域,即使它不是因为实习.但是在第一个例子中,唯一的原因是,如果Java在幕后做了一些对我没用的东西,而且我不能利用它.

后续问题 即使a和string-literal都指向内存中的相同区域,对于我在上面的表达式中有什么用处.如果该表达式返回true,那么我可以用这些知识做什么有用的东西,是吗?如果我正在比较两个变量,那么是的,那些信息会很有用,但是对于变量和文字,它有点无意义.

Jar*_*Par 13

实际上,如果Java选择实习字符串,它们确实可以是相同的引用.字符串实习是在运行时只有一个不同字符串值的概念.

Java注意到字符串实习

  • 并且做`new String("foo")`是一种不好的做法 (2认同)

Ang*_*ese 8

编译器警告往往是关于公然错误(条件永远不会是真或假)或不安全(未经检查的强制转换)的事情.使用==是有效的,在某些极少数情况下是有意的.

我相信所有的Checkstyle,FindBugsPMD都会对此发出警告,并且可选择在半睡半醒或者其他方面无能为力时我们倾向于采取其他许多不良做法;).