本教程适用于JDK 8。本页面中描述的示例和实践不利用后续版本中引入的改进,并可能使用已不再可用的技术。
请参阅Java语言变化以获取Java SE 9及其后续版本中的更新语言特性的摘要。
请参阅JDK发行说明以获取有关所有JDK版本的新功能、增强功能和已删除或弃用选项的信息。
以下规则定义了创建不可变对象的简单策略。并非所有被文档化为“不可变”的类都遵循这些规则。这并不一定意味着这些类的创建者粗心——他们可能有充分的理由相信他们的类的实例在构造后不会改变。然而,这些策略需要复杂的分析,对初学者来说并不适用。
final和private。final。更复杂的方法是将构造函数声明为private,并在工厂方法中构造实例。将这个策略应用于SynchronizedRGB,得到以下步骤:
set任意地转换对象,在不可变版本的类中没有地位。第二个方法invert可以通过创建一个新对象来适应,而不是修改现有对象。private;它们进一步被修饰为final。final。在进行这些更改后,我们得到了:ImmutableRGB
final public class ImmutableRGB {
// 值必须在0和255之间。
final private int red;
final private int green;
final private int blue;
final private String name;
private void check(int red,
int green,
int blue) {
if (red < 0 || red > 255
|| green < 0 || green > 255
|| blue < 0 || blue > 255) {
throw new IllegalArgumentException();
}
}
public ImmutableRGB(int red,
int green,
int blue,
String name) {
check(red, green, blue);
this.red = red;
this.green = green;
this.blue = blue;
this.name = name;
}
public int getRGB() {
return ((red << 16) | (green << 8) | blue);
}
public String getName() {
return name;
}
public ImmutableRGB invert() {
return new ImmutableRGB(255 - red,
255 - green,
255 - blue,
"Inverse of " + name);
}
}