私たちは皆、あなたがこのようなことをすることができないことを知っています:
int a = 7;
new Runnable() {
public void run() {
System.out.println(a);
}
}.run();
...
...a
決勝戦を行わずに。技術的な理由がわかります。これは、ローカル変数がスタック上に存在し、変更されないことがわかっていない限り、安全にコピーを作成できないためです。
しかし、私が理解するのに苦労しているのは、コンパイラに実装ハックがない理由です。そのため、上記の状況を検出すると、次のようにコンパイルされます。
int[] a = {7};
new Runnable() {
public void run() {
System.out.println(a[0]);
}
}.run();
...
そうすれば、匿名の内部クラスからにアクセスして、必要に応じて実際に変更しても安全な位置にいます。もちろん、実際に変更した場合にのみ、このハックを実行する可能性がありますa
。私が見る限り、これは比較的簡単に入れることができ、すべてのタイプで機能し、a
どんな文脈からでも変えられるべきです。もちろん、上記の提案を変更して、複数の値に合成ラッパークラスを使用するか、もう少し効率的な別のアプローチを使用することもできますが、考え方は同じです。パフォーマンスにわずかな影響があると思いますが、特に内部でさらに最適化される可能性がある場合は、過度になるとは思えません。合成フィールドが特定の方法で壊れることに依存する特定の反射的な呼び出しを除いて、私は多くの不利な点を見ることができませんが、それが真剣に提案されたのを聞いたことがありません!理由はありますか?