元はJavaですが、分かりやすくするためにGroovyで問題箇所だけ書き起こしました。
staticMemberFail.groovy
// 久々に触ったJavaでこういうことをやってしまったと言う話
public final class MyClassOne{
private static final ArrayList<String> myList = new ArrayList<String>()
//-------^これがミス
public MyClassOne add(String str){
myList.add(str)
return this
}
public int size(){
myList.size()
}
}
def myClassOne1 = new MyClassOne()
def myClassOne2 = new MyClassOne()
assert(myClassOne1.add("hoge").size()==1)
assert(myClassOne2.add("hoge").size()==1) // これが失敗する
// なぜならmyListは
// MyClassOneのインスタンス全てで
// 共有されているから実際のサイズは2
特に定数の定義とかしたあとだと、finalって書こうとすると、
手が勝手にstaticとか打っちゃうんだよね。
随分昔にC言語でも同じ事やったけど、またやってしまったって話です。
まぁ、テストコード書いてたから気がついたんですが。
テスト重要ですよー。