
http://d.hatena.ne.jp/aufheben/20110129/1296328721
こちらのサイトを参考にしました。
Java
1public class Main { 2 3 public static void main(String[] args) { 4 Function0<Integer> c1 = newCounter(); 5 println(c1.apply()); 6 println(c1.apply()); 7 println(c1.apply()); 8 println(c1.apply()); 9 println(c1.apply()); 10 } 11 12 static Function0<Integer> newCounter() { 13 // 変更可能とするためオブジェクトでラップする。 14 final IntHolder i = new IntHolder(0); 15 // ↓これがクロージャ。 16 return new Function0<Integer>() { 17 public Integer apply() { 18 // 関数の外部の変数を参照/変更する。 19 return ++i.value; 20 } 21 }; 22 } 23 24 static void println(Object o) { 25 System.out.println(o); 26 } 27 28 interface Function0<R> { 29 R apply(); 30 } 31 32 class IntHolder { 33 public int value; 34 public IntHolder(int value) { 35 this.value = value; 36 } 37 } 38 39 40}
元の記事はクロージャーに関するものですが、質問はクロージャーについてではありません。
上のコードを実行しようとすると、
Error:(14, 29) java: staticでない変数 thisをstaticコンテキストから参照することはできません
と出ます。
おそらく
Java
1final IntHolder i = new IntHolder(0);
でインスタンスを生成しようとした時に、当然コンストラクタが呼ばれるわけですが、その際にコンストラクタ内で用いられるthisがstaticではないからエラーが出ているのだと思います。
そうすると、上のようにstaticメソッド内でフィールドの値を設定したインスタンスを生成しようとすると、どのようにしたらいいのでしょうか?
回答お願いします。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/11 13:30
2016/09/11 13:39
退会済みユーザー
2016/09/11 13:52
退会済みユーザー
2016/09/11 14:01
2016/09/11 14:05 編集
2016/09/11 14:02
退会済みユーザー
2016/09/11 14:04
退会済みユーザー
2016/09/11 14:11 編集
2016/09/11 14:11
退会済みユーザー
2016/09/11 14:15