class Logger { static /*@non_null @*/ List theList = new List(); public static void log(String msg) { System.err.println("Log "+msg+": state of list is "+theList); } } public class List { private /*@ non_null @*/ int[] content = new int[0]; private int size; /*@ private invariant 0 <= size && size <= content.length; @*/ public void add(int v) { size++; if (size > content.length) { Logger.log("growing content"); int[] newContent = new int[2*size]; System.arraycopy(content, 0, newContent, 0, content.length); content = newContent; } content[size-1] = v; } //@ private ghost String myString; in privateState; //@ private represents theString <- myString; public String toString() { String s = "["; String comma =""; for (int i = 0; i < size; i++) { s += comma + content[i]; comma = ","; } s += "]"; //@ set myString = s; return s; } public static void main(String[] param) { List list = Logger.theList; list.add(5); } }