“一成稳定”的漏洞(java)
当前位置:以往代写 > JAVA 教程 >“一成稳定”的漏洞(java)
2019-06-14

“一成稳定”的漏洞(java)

“一成稳定”的漏洞(java)

从外貌看,稳定类的成立好像是一个好方案。可是,一旦真的需要那种新范例的一个修改的工具,就必需辛苦地举办新工具的建设事情,同时尚有大概涉及更频繁的垃圾收集。对有些类来说,这个问题并不是很大。但对其他类来说(好比String类),这一方案的价钱显得太高了。
为办理这个问题,我们可以建设一个“同志”类,并使其可以或许修改。今后只要涉及大量的修改事情,就可换为利用能修改的同志类。完事今后,再切换回不行变的类。
因此,上例可改成下面这个样子:
 

//: Immutable2.java
// A companion class for making changes
// to immutable objects.

class Mutable {
  private int data;
  public Mutable(int initVal) {
    data = initVal;
  }
  public Mutable add(int x) { 
    data += x;
    return this;
  }
  public Mutable multiply(int x) {
    data *= x;
    return this;
  }
  public Immutable2 makeImmutable2() {
    return new Immutable2(data);
  }
}

public class Immutable2 {
  private int data;
  public Immutable2(int initVal) {
    data = initVal;
  }
  public int read() { return data; }
  public boolean nonzero() { return data != 0; }
  public Immutable2 add(int x) { 
    return new Immutable2(data + x);
  }
  public Immutable2 multiply(int x) {
    return new Immutable2(data * x);
  }
  public Mutable makeMutable() {
    return new Mutable(data);
  }
  public static Immutable2 modify1(Immutable2 y){
    Immutable2 val = y.add(12);
    val = val.multiply(3);
    val = val.add(11);
    val = val.multiply(2);
    return val;
  }
  // This produces the same result:
  public static Immutable2 modify2(Immutable2 y){
    Mutable m = y.makeMutable();
    m.add(12).multiply(3).add(11).multiply(2);
    return m.makeImmutable2();
  }
  public static void main(String[] args) {
    Immutable2 i2 = new Immutable2(47);
    Immutable2 r1 = modify1(i2);
    Immutable2 r2 = modify2(i2);
    System.out.println("i2 = " + i2.read());
    System.out.println("r1 = " + r1.read());
    System.out.println("r2 = " + r2.read());
  }
} ///:~

和往常一样,Immutable2包括的要领保存了工具不行变的特征,只要涉及修改,就建设新的工具。完成这些操纵的是add()和multiply()要领。同志类叫作Mutable,它也含有add()和multiply()要领。但这些要领可以或许修改Mutable工具,而不是新建一个。除此以外,Mutable的一个要领可用它的数据发生一个Immutable2工具,反之亦然。
两个静态要领modify1()和modify2()展现出得到同样功效的两种差异要领。在modify1()中,所有事情都是在Immutable2类中完成的,我们可看到在历程中建设了四个新的Immutable2工具(并且每次从头分派了val,前一个工具就成为垃圾)。
在要领modify2()中,可看到它的第一个动作是获取Immutable2 y,然后从中生成一个Mutable(雷同于前面临clone()的挪用,但这一次建设了一个差异范例的工具)。随后,用Mutable工具举办大量修改操纵,同时用不着新建很多工具。最后,它切换回Immutable2。在这里,我们只建设了两个新工具(Mutable和Immutable2的功效),而不是四个。
这一要领出格适合在下述场所应用:
(1) 需要不行变的工具,并且
(2) 常常需要举办大量修改,可能
(3) 建设新的稳定工具价钱太高

    关键字:

在线提交作业