public final type attribute_name;
and
private type attribute_name;
public type getA_name() {
return attribute_name;
}
我想让一个属性变成只读的,这样在初始化后就不能更改了。
我应该将其设置为public final
,还是将其设置为private
,并只通过get方法(没有set方法)来访问它?
当类的成员变量不是final
而是private
时,该类本身可以更改该值。
final
字段在构造函数退出之前必须被设置。一旦设置,引用就不能被修改(值不能被重新分配)。强调不能被重新分配。这意味着虽然引用不能改变,值本身可以改变。
以下是合法的:
final List<Integer> list = new List<Integer>();
list.add(5); // the value of list changes, but the reference doesn't
这不是:
final List<Integer> list = new List<Integer>();
list = new List<Integer>(); // may seem sort of redundant but the compiler won't allow it nonetheless
一个带有只读取器的private
变量可以被包含它的类内部重新分配(但在外部不可见,因此不能在持有它的类之外重新分配)。此外,在类之外,引用是不可访问的,因此除了持有它的类之外,变量不能被修改。
final
变量无法在任何地方重新分配,但如果它是公共的,则另一个类仍然可以访问引用并更改其指向的任何对象的值。
如果您不希望变量在初始化后被重新分配,如您所描述的那样,请同时使用final
和private
。
final
来表示类似这样的东西:public class User {
private final long registrationTimeMillis;
public User(/* various parameters probably would be here */) {
registrationTimeMillis = System.currentTimeMillis();
}
public long getRegistrationTimeMillis() {
return registrationTimeMillis;
}
}
对于这样的情况,请使用没有setter的private
:
public class VendingController() {
private int drinksStocked = 0;
private int drinksDispensed = 0;
public void dispenseDrink() {
drinksDispensed++;
}
public void stockDrinks(int numberOfDrinks) {
drinksStocked = getDrinksRemaining() + numberOfDrinks;
drinksDispensed = 0;
}
public int getDrinksRemaining() {
return drinksStocked - drinksDispensed;
}
}
drinksDispensed
的值在没有调用dispenseDrink()
或者stockDrinks(int numberOfDrinks)
时发生改变。然而,在售货机重新填充时,它仍然需要被自己的类重新分配,因此我们不应该将其声明为final
。请注意,需要保留html标签。
关于使用 public final
,通常在Java中只针对常量进行这样的操作,并且还包括 static
关键字,因为常量不应该依赖于一个实例。
以下是使用 public static final
的合理情况示例:
public class UnitConversions {
public static final double CENTIMETERS_PER_INCH = 2.54;
}
public double convertFromCentimetersToInches(double centimeters) {
return centimeters / UnitConversions.CENTIMETERS_PER_INCH;
}
public final
。 即使由于final
而使字段不可变,仍然将其设置为private
通常是一个好主意。final
关键字的完整文档:http://en.wikipedia.org/wiki/Final_(Java)
这取决于您想从哪里访问它。公共变量可以从项目和包中的任何类中访问,而私有变量只能从变量所在的类中访问。
'final'运算符使其成为永久和只读的。
假设type
是一个对象的引用,而不是原始类型。
public final type attribute_name
表示attribute_name
不能被重新分配到其他地方。但是,attribute_name
可以用于调用改变其状态的方法。
在private type attribute_name
中,只有类内部的方法才能调用attribute_name
上的方法。
因此,如果您希望保持其恒定性,请使用方法(2)。将public
方法限制为最终调用不修改其状态的attribute_name
方法。