【发布时间】:2012-09-05 17:34:09
【问题描述】:
因为你不能设置最终变量的值(我假设),比如数组的长度。
Object[] items = new Object[10];
//Not allowed
Object.length = 3;
是否可以将其用作班级中的只读字段。
【问题讨论】:
因为你不能设置最终变量的值(我假设),比如数组的长度。
Object[] items = new Object[10];
//Not allowed
Object.length = 3;
是否可以将其用作班级中的只读字段。
【问题讨论】:
这取决于您所说的“OK”是什么意思。不能更改items.length 的原因是length 是只读字段;创建数组后,它的大小是固定的。无论items 是否声明为final,您指定的“不允许”行都是无效的。
重要的是要理解将items 设为final 变量只是意味着您将无法更改变量的值以引用不同的数组。变量值是一个引用,不是数组本身。您无法更改变量引用的数组,但您仍然可以更改数组的内容:
// Entirely valid...
items[0] = new Object();
如果你想要真正不可变的东西,你不能使用数组。
【讨论】:
readonly 和 java 中的 final 大致相同(至少在应用于字段时)。每当您将字段标记为 final 时,编译器将不允许您在通过变量初始化或通过对象构造函数分配后修改其引用。
但是它不会阻止你修改你引用的对象的内容,做这样的事情:
public class Person {
public final String name;
public final Address address;
public Person(String name, Address address) {
this.name = name;
this.address = address;
}
}
//Someplace else
Person peter = new Person("peter", new Address("Dolphin Cove 993", "Stamford", "CT");
peter.address.state = "CA"
即使“地址”字段是最终的,它也是完全有效的。
另外,不要依赖 final 来构建任何类型的“安全性”或对某些值的强访问限制,因为它很容易通过反射被打破。 (http://stackoverflow.com/questions/4516381/changeing-private-final-fields-via-reflection)
可能不需要所有这些澄清,但有人可能会发现它很有用
干杯, 克劳迪奥
【讨论】:
有些人喜欢将所有实例变量保持私有并使用“getter”,例如getLength() 方法,但这真的是个人喜好。公共最终字段没有任何明确的错误;这只是风格。就个人而言,我有时会将它们用于非常简单的类。
【讨论】:
当然,因此将其公开为只读的方法是将成员变量“items”保留在您的类中私有并公开一个公共 getter 方法。比如:
public int getNumItems() {
return (items == null ? 0 : items.length); //includes null handling using ternary operator
}
【讨论】: