本教程适用于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); } }