 
                            ...
| Code Block | ||
|---|---|---|
| 
 | ||
| 
public final class MutableDemo {
  // java.net.HttpCookie is mutable
  public void UseMutableInput(HttpCookie cookie) {
    if (cookie == null) {
      throw new NullPointerException();
    }
    //check if cookie has expired
    if(cookie.hasExpired()) {
      //cookie is no longer valid, handle condition
    }
    doLogic(cookie);  //cookie may have expired since time of check resulting in an exception
  }
}
 | 
Compliant Solution
| Wiki Markup | 
|---|
| The problem is alleviated by creating a copy of the mutable input and using it to perform operations so that the original object is left unscathed. This can be realized by implementing the {{java.lang.Cloneable}} interface and declaring a {{public}} clone method or by using a copy constructor. Performing a manual copy of object state within the caller becomes necessary if the mutable class is declared as {{final}} (that is, it cannot provide an accessible copy | 
| method). (See \[[Guideline 2-1 Create a copy of mutable inputs and outputs|http://java.sun.com/security/seccodeguide.html]\].) Note that the input validation must follow after the creation of the copy. | 
| Code Block | ||
|---|---|---|
| 
 | ||
| 
public final class MutableDemo {
  // java.net.HttpCookie is mutable
  public void copyMutableInput(HttpCookie cookie) {
    if (cookie == null) {
      throw new NullPointerException();
    }
    // create copy
    cookie = cookie.clone();
    //check if cookie has expired
    if(cookie.hasExpired()) {
      //cookie is no longer valid, handle condition
    }
    doLogic(cookie);
  }
}
 | 
...