LoginSignup
3
4

More than 5 years have passed since last update.

staticメンバー変数のスコープにまつわる地雷を踏み抜いた話

Posted at

元は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言語でも同じ事やったけど、またやってしまったって話です。
まぁ、テストコード書いてたから気がついたんですが。

テスト重要ですよー。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4