java: "final" System.out、System.in、System.err?
質問
System.out
は
public static final PrintStream out
.
しかし、あなたは
System.setOut()
を使用して再割り当てすることができます。
あれ?これって、もしや
final
?
(同じ点が
System.in
と
System.err
)
さらに重要なことは、もしあなたが public static final フィールドを変異させることができるのであれば、これは
final
があなたに与える保証に関して、これは何を意味するのでしょうか?(私はSystem.in/out/errの振る舞いが
final
変数として振る舞います)
どのように解決するのですか?
通常、最終的な静的フィールドは変更することができません。しかし
System.in
,System.out
そしてSystem.err
は最終的な静的フィールドで、レガシーな理由により、メソッドSystem.setIn
,System.setOut
とSystem.setErr
. 私たちはこれらのフィールドを ライトプロテクトフィールド と呼び、通常の最終フィールドと区別しています。コンパイラは、これらのフィールドを他の最終フィールドとは異なる方法で扱う必要があります。例えば、通常の最終フィールドの読み込みは同期化に対して "immune"です。ロックまたは volatile 読み込みに関わるバリアは、最終フィールドから読み込まれる値に影響を与える必要はありません。書き込み禁止フィールドの値は変更される可能性があるため、同期イベントはそれらに影響を与えるはずです。したがって、セマンティクスでは、これらのフィールドはユーザーコードによって変更されない通常のフィールドとして扱われます。
System
クラスでない限り、ユーザーコードによって変更されない通常のフィールドとして扱われます。
ところで、実は
final
を呼び出すことで、リフレクションを通じて
setAccessible(true)
を呼び出すことで(あるいは
Unsafe
メソッドを使って)。このようなテクニックはデシリアライズの間、Hibernateや他のフレームワークなどで使用されますが、1つの制限があります:変更前に最終フィールドの値を見ていたコードは、変更後に新しい値を見ることが保証されていません。問題のフィールドについて特別なことは、コンパイラーによって特別な方法で扱われるため、この制限から解放されることです。
関連
-
java マイクロソフト払い戻し予期せぬサーバーからのファイルの終了
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Javaで配列を宣言し、初期化する方法は?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
スレッド "main "での例外 java.util.NoSuchElementException in Java 問題解決済み
-
Java の switch case 文で必要な定数式の問題の解決法
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
無効な文字定数
-
ジャバアレイ
-
Junitのユニットテストエラー
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション