アプリケーション全体の変数をJavaに格納するためにSystem.getProperty()
/を使用することに伴う潜在的な問題(セキュリティ、パフォーマンス)または一般的な悪い雰囲気はありますか?System.setProperty()
6 に答える
はい、多くの理由から、それは悪い習慣です:
パフォーマンス: システム プロパティ オブジェクトは内部のハッシュ テーブルです。取得と設定は、通常の getter または setter メソッドよりもおそらく 2 桁遅くなります。
型の安全性: 変数がすべて文字列でない限り、プロパティの値の型が間違っている可能性があり、実行時エラーや複雑さなどを引き起こすという問題があります。
型変換のコスト: たとえば、整数値のプロパティは、set および get 操作ごとに変換する必要があります。安くない。
トレーサビリティ: 名前付きシステム プロパティへの参照よりも、実際の変数への参照を見つける方が簡単です。
セキュリティの制限: システム プロパティへのアクセスは、セキュリティ マネージャーによって制御されます。
そしてもちろん、それは不要です。「グローバル」変数が本当に必要な場合は、static
変数で問題なく機能します。Properties
また、アプリケーションの (システム以外の) プロパティを保持するためにオブジェクトを本当に使用する必要がある場合は、Properties
オブジェクトの別のインスタンスを使用してください。
グローバルにアクセス可能な変数の要件が競合する可能性があるため、これは悪い考えです。このクラスへの依存関係を管理することも非常に困難です。他に選択肢がない場合にのみ、これを行います。
それは良い考えではありません。その名前が示すように、これはシステム プロパティ用です。
あなたのコードを見ている人は、それらがグローバル変数であり、システム関連の設定ではないことを理解するのに苦労するでしょう.
どうしてもグローバル変数を使いたい場合は、シングルトンや静的変数を使った方が良いと思います。
むしろより良い代替手段があります。システム プロパティにアクセスする代わりに、少なくとも標準のプロパティ ローダー メカニズムを使用して RessourceBundle をロードし、そのバンドルを読み書きすることができます。
システム プロパティは、ユーザーの知らないうちにサード パーティによって変更される可能性があり、ユーザーはそれをあまり制御できません。
プロパティ ファイルを使用し、Properties
クラスを利用することをお勧めします。
File file = new File("your.properties");
FileInputStream input = new FileInputStream(file);
Properties properties = new Properties();
properties.load(input);
そして.getProperty
、必要なときに使用してください。グローバルシステム変数は悪い考えだと思います。
グローバル変数は通常、設計上の欠陥です。コンポーネントは自己完結型である必要があり、グローバルな状態は必要ありません。代わりに、public static フィールドを使用してください。