在声明期间在bean中创建新字符串的目的?

时间:2016-03-23 11:29:18

标签: java javabeans

继承现有代码库,无法联系原始开发人员。

据我所知,对于普通的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,因此在任何一种情况下都需要进行相同类型的值检查。

4 个答案:

答案 0 :(得分:3)

它只是给出一个初始非空值。

但是写一下

会更好
private String foo = "";
private String bar = "";

因为不需要创建新的String对象,所以最好重用字符串池中的空字符串实例。

答案 1 :(得分:2)

考虑到没有理由使用new String();而不是""(在这种情况下,可能会有一些边缘情况需要明确的空字符串),这可能只是他学到的一个坏习惯某处。

答案 2 :(得分:2)

创建String对象有哪些不同的方法?

我们可以使用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 ???当然没有。

请查看下面的图片,以获得更具说明性的示例。

enter image description here

答案 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

foo2bar2将指向相同的字面值,因此将等于' (在==的意义上)。有关详细信息,请参阅example usage

但你永远不应该依赖于此。始终在字符串上使用equals