继承现有代码库,无法联系原始开发人员。
据我所知,对于普通的Java bean,你有变量声明,getter和setter。
public class FooBean{
private String foo;
private String bar;
// getters and setters
}
但是在这段代码中,我注意到所有字符串都已初始化。
public class FooBean{
private String foo = new String();
private String bar = new String();
// getters and setters
}
处理这个bean的代码没有任何特殊的特殊情况,它似乎与删除的初始化完全相同。
是否有理由创造这种方式?它有什么副作用我没有意识到吗?
它不会阻止字段设置为null,因此在任何一种情况下都需要进行相同类型的值检查。
答案 0 :(得分:3)
它只是给出一个初始非空值。
但是写一下
会更好private String foo = "";
private String bar = "";
因为不需要创建新的String对象,所以最好重用字符串池中的空字符串实例。
答案 1 :(得分:2)
考虑到没有理由使用new String();
而不是""
(在这种情况下,可能会有一些边缘情况需要明确的空字符串),这可能只是他学到的一个坏习惯某处。
答案 2 :(得分:2)
我们可以使用new运算符创建String对象,就像任何普通的java类一样,或者我们可以使用双引号(文字赋值)来创建String对象。
String类中有几个构造函数可以从char数组,字节数组,StringBuffer和StringBuilderetc等中获取String。
当我们使用双引号创建String时,JVM会在String池中查找是否存储具有相同值的任何其他String。如果找到,它只返回对该String对象的引用,否则它会创建一个具有给定值的新String对象并将其存储在String池中。
当我们使用new运算符时,JVM会创建String对象,但不会将其存储到String Pool中。我们可以使用intern()方法将String对象存储到String池中,或者如果池中已存在具有相等值的String,则返回引用。
所以当你这样做时
String s1 = "abc";
String s2 = "abc";
在StringPool中检查那些,因为s1已存在,s2将采用相同的引用,因此,s1 == s2为真。
但是当你这样做时:
String s3 = new String("abc");
String s4 = new String("abc");
您正在使用 new运算符,因此JVM没有检查堆中是否已存在字符串,它只会为s4分配 new 空间,所以是s3 == s4 ???当然没有。
请查看下面的图片,以获得更具说明性的示例。
答案 3 :(得分:1)
不,这没有任何意义。在简单的文字String
上使用""
构造函数通常是不好的做法。
foo = new String()
和foo = ""
之间存在一些但很重要的差异:
String foo1 = new String();
String bar1 = new String();
System.out.println(foo1 == bar1);
String foo2 = "";
String bar2 = "";
System.out.println(foo2 == bar2);
这个输出将是
false
true
foo2
和bar2
将指向相同的字面值,因此将等于' (在==
的意义上)。有关详细信息,请参阅example usage。
但你永远不应该依赖于此。始终在字符串上使用equals