[解決済み] なぜ無名クラスではfinal変数しかアクセスできないのですか?
質問
-
a
はここでしかできないことです。 再割り当ての方法を教えてください。a
においてonClick()
をプライベートメンバーとして維持することなく、メソッドを使用できますか?private void f(Button b, final int a){ b.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { int b = a*5; } }); }
-
を返すにはどうしたらいいのでしょうか?
5 * a
クリックしたとき?という意味です。private void f(Button b, final int a){ b.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { int b = a*5; return b; // but return type is void } }); }
どのように解決するのか?
コメントで指摘されているように、この一部はJava 8では無意味になります。
final
は暗黙の了解とすることができる。ただし
事実上
final 変数は、匿名内部クラスやラムダ式で使用することができます。
基本的にはJavaの管理方法によるものです。 クロージャ .
匿名内部クラスのインスタンスを作成すると、そのクラス内で使用されるすべての変数に 値 は、自動生成されるコンストラクタによってコピーされます。これにより、例えばC#コンパイラのように、コンパイラがローカル変数の論理状態を保持するために様々な追加の型を自動生成する必要がなくなります... (C#が匿名関数で変数をキャプチャするとき、それは本当に変数をキャプチャします。クロージャは、メソッドのメインボディから見える方法で変数を更新でき、その逆もまた可能です。)
値が匿名の内部クラスのインスタンスにコピーされたので、その変数がメソッドの残りの部分によって変更されると奇妙に見えるでしょう。 となる 異なる時間に取得されたコピーで作業していることになります)。同様に、無名の内部クラスで変更を加えた場合、開発者はその変更が内部メソッドのボディで見えることを期待するかもしれません。
値を一切変更できないので、そのような変更が目に見えるかどうかを心配する必要はないのです。メソッドと匿名の内部クラスが互いの変更を見ることができるようにする唯一の方法は、何らかの記述のミュータブル型を使用することです。これは包含するクラスそのものであったり、配列であったり、ミュータブルラッパータイプであったり、そんなものです。基本的には、あるメソッドと別のメソッドの間で通信を行うようなものです。 パラメータ に対する変更は、そのメソッドの呼び出し元には見えません。 参照先 パラメータによって見られる。
JavaとC#のクロージャをもっと詳しく比較したい方は 記事 があり、さらに踏み込んだ内容になっています。この回答では、Java側に焦点を当てたかったのです :)
関連
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
Eclipseでプロジェクトエクスプローラービューとパッケージエクスプローラービューを使う
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
Javaエラーメッセージがenclosingクラスでない
-
[解決済み] 静的変数が悪とされるのはなぜですか?
-
[解決済み] Javaにおける "final class "の意味とは?
-
[解決済み】オプショナルの使用方法
-
[解決済み】JavaでAnonymousインナークラスはどのように使用されていますか?
-
[解決済み】なぜインターフェース変数は、デフォルトでstaticとfinalなのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
アクセス制限について アプリケーションの種類がAPIでない(必要なライブラリの制限)。
-
final, finally, finalizeの違いについて話してください。
-
Enumとの組み合わせでswitchの使い方を一度覚えるために必要な定数式
-
Spring boot runs with Error creating bean with name 'entityManagerFactory' defined in class path resource
-
エラーの解決方法 jarfile XXX.jarにアクセスできません。
-
スレッド "main" で例外発生 java.lang.ArrayIndexOutOfBoundsException: 4 at text.Division.main(Divisi
-
リソースの読み込みに失敗しました。サーバーはステータス500(内部サーバーエラー)で応答しました。
-
自動配線された依存性のインジェクションに失敗しました。
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
Maven Pluginの実行がライフサイクル設定の対象外であるエラーの解決