我想知道
之间有什么区别public final type attribute_name;
和
private type attribute_name;
public type getA_name() {
return attribute_name;
}
基本上我想将属性设为只读,因此在初始化后它不能改变。
我是public final
,还是我private
,只能通过get方法访问它(没有set方法)?
答案 0 :(得分:4)
如果它不是final
而是private
,则该类本身可以更改该值。
答案 1 :(得分:1)
在构造函数退出之前设置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
具有唯一getter的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;
}
}
我们不希望用户的注册时间会发生变化,所以在构建之后不允许它更改是有意义的。
使用private
没有setter,如下所示:
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
关于使用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;
}
祝你好运OP和快乐的编码。
答案 2 :(得分:1)
final修饰符允许只分配一次字段 - 之后不能更改它,并且必须在对象构造期间(即构造函数返回之前)设置它。
如果要将字段设置为只读,请使用信息隐藏原则:将其设为私有并提供返回字段的公共getter(或非原始类型的副本)。
您应该仅将public final
用于真正的常量。即使您的字段因final
而不可变,通常仍然可以将其设为private
。
答案 3 :(得分:1)
这取决于一些因素。
如果这是一个以前已知并且永远不会改变的实常数,那么请使用final
。在Java中final
字段也可以在构造函数中初始化,因此如果您的值在构造时已知,那么您也可以使用final
。
如果在运行时期间设置此值(一次,多次),请使用private
+ getter
。
答案 4 :(得分:0)
正确的方法是在未来思考。什么可以帮助您实现目标?也许以后你也想给这个变量一个值。如果我是你,我会通过一个get方法创建并保持变量私有。
final
关键字的完整文档:http://en.wikipedia.org/wiki/Final_(Java)
答案 5 :(得分:0)
取决于您要从哪里访问它。公共变量可以从项目和包中的任何类访问,其中private只能从变量所在的类访问。
'final'运算符使其成为永久和只读。
答案 6 :(得分:0)
我们假设type
是对象的引用,而不是基本类型。
public final type attribute_name
表示attribute_name
无法重新分配以引用其他内容。但attribute_name
可以用于调用更改其状态的方法。
在private type attribute_name
中,只有类中的方法可以调用attribute_name
上的方法。
因此,如果您希望它保持不变,请使用方法(2)。将public
方法限制为最终调用attribute_name
上不修改其状态的方法的方法。