zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

Oracle官方并发教程之不可变对象(定义不可变对象的策略)

Oracle官方教程并发对象 定义 策略 不可
2023-09-11 14:16:10 时间

原文链接译文链接,译者:Greenster,校对:郑旭东

以下的一些规则是创建不可变对象的简单策略。并非所有不可变类都完全遵守这些规则,不过这不是编写这些类的程序员们粗心大意造成的,很可能的是他们有充分的理由确保这些对象在创建后不会被修改。但这需要非常复杂细致的分析,并不适用于初学者。

不要提供setter方法。(包括修改字段的方法和修改字段引用对象的方法) 将类的所有字段定义为final、private的。 不允许子类重写方法。简单的办法是将类声明为final,更好的方法是将构造函数声明为私有的,通过工厂方法创建对象。 如果类的字段是对可变对象的引用,不允许修改被引用对象。 不提供修改可变对象的方法。 不共享可变对象的引用。当一个引用被当做参数传递给构造函数,而这个引用指向的是一个外部的可变对象时,一定不要保存这个引用。如果必须要保存,那么创建可变对象的拷贝,然后保存拷贝对象的引用。同样如果需要返回内部的可变对象时,不要返回可变对象本身,而是返回其拷贝。
SynchronizedRGB类有两个setter方法。第一个set方法只是简单的为字段设值(译者注:删掉即可),第二个invert方法修改为创建一个新对象,而不是在原有对象上修改。 所有的字段都已经是私有的,加上final即可。 将类声明为final的 只有一个字段是对象引用,并且被引用的对象也是不可变对象。

经过以上这些修改后,我们得到了ImmutableRGB

final public class ImmutableRGB {

 // Values must be between 0 and 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 amp;lt; 0 || red amp;gt; 255

 || green amp;lt; 0 || green amp;gt; 255

 || blue amp;lt; 0 || blue amp;gt; 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 amp;lt; amp;lt; 16) | (green amp;lt; amp;lt; 8) | blue);

 public String getName() {

 return name;

 public ImmutableRGB invert() {

 return new ImmutableRGB(255 - red,

 255 - green,

 255 - blue,

 amp;quot;Inverse of amp;quot; + name);

文章转自 并发编程网-ifeve.com

047:使用SQL SELECT语句检索数据(Retrieving Data Using the SQL SELECT Statement) 047:条件和排序(Restricting and Sorting Data)