Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
bgColor#FFcccc
class BadClone implements Cloneable {
  HttpCookie[] cookies;
  =
 new BadClone(HttpCookie[20]] c) {
    cookies = c;
  }
 
  public Object clone() throws CloneNotSupportedException {		
    final BadClone clone = (BadClone) super.clone();
    clone.doSomething();
    clone.cookies = clone.deepCopy();
    return clone;
  }

  void doSomething() { // overridable
    for(int i=0;i<cookies.length;i++) {
      cookies[i].setValue("" + i);
    }
  }
  
 public voidHttpCookie[] deepCopy() {
    if (cookies == null) {
      throw new NullPointerException();
    }
     
    // deep copy
    HttpCookie[] cookiesCopy = new HttpCookie[cookies.length];

    for (int i = 0; i < cookies.length; i++) {
      // manually create copy of each element in array
      cookiesCopy[i] = (HttpCookie) cookies[i].clone();
    }
    return cookiesCopy;
  }
}

class Sub extends BadClone {
  Sub(HttpCookie[] c) {
    super(c);
  }

  public Object clone() throws CloneNotSupportedException {		
    final Sub clone = (Sub) super.clone();
    clone.doSomething();
    return clone;
  }
   
  void doSomething() { // erroneously gets executed
    for(int i=0;i<cookies.length;i++) {
      cookies[i].setDomain(i + ".foo.com");
    }
  } 
  
  public static void main(String[] args) throws CloneNotSupportedException {
    HttpCookie[] hc = new HttpCookie[20];
    for(int i=0;i<hc.length;i++){	
      hc[i] = new HttpCookie("cookie" + i,"" + i);
    }
    BadClone bc = new Sub(hc);
    bc.clone();
  }
}

Compliant Solution

Code Block
bgColor#ccccff