问题描述
我有以下两个类:
public class A{
private String s;
public A(String s){
this.s = s;
}
}
public class B{
private static final String STR = "String";
public void doAction(){
A a = new A(STR); //Does it look really wierd?
}
}
我从未将静态final字段作为构造函数参数传递,因此它是否会导致潜在的错误? 我们应该避免它,或者我们可以做到这一点,如果它看起来简洁。
1楼
我从未将静态final字段作为构造函数参数传递,因此它是否会导致潜在的错误?
这不会导致错误,因为doAction
是一个实例方法。
具有初始值设定项的所有静态字段将在调用第一个实例方法之前初始化,因此您是安全的。
我们应该避免它,或者如果看起来简洁,我们可以做到吗?
在实例方法中使用静态final字段(实际上是String
常量)是完全有效的选择。
2楼
如果字段是不可变的,您不必担心(就像您的情况: String
是不可变的数据结构)。
对于可变对象(例如数组 ),您应该考虑对一个对象中此字段的所有更改对于具有相同字段的其他对象是否可见,无论它是否为静态。
这些代码看起来并不奇怪。
3楼
String是一种引用类型,但它有时像原始类型一样工作。 如果使用String对象作为参数,它将像其他原始变量一样被复制。 我不明白你将类变量作为其他对象的参数传递的原因。 但是,不会出现由此类对象之间共享属性引起的任何问题。