Java アイコン定数 - 静的定数は大丈夫ですか?
質問
アプリケーション全体で使用されるアイコンが多数あります。例として [OK]/[キャンセル] アイコンを考えてみましょう。現時点ではティックとバツ (tick.png、cross.png) ですが、将来的には置き換える可能性があります。また、リソースのパスを 1 か所にまとめておきたいと考えています。
これでいい:
public class Icons {
public static Icon OK = new ImageIcon(Icons.class.getResource("/icons/tick.png");
public static Icon CANCEL = new ImageIcon(Icons.class.getResource("/icons/cross.png");
}
それとも別の方法でやるべきでしょうか?画像ファイルは .jar 内にあるため、実行時に画像ファイルの存在に依存しても問題ありません。
解決
Bent のアイデアを初期化に使用し、定数を最終的なものにしました。
public final class Icons {
private static final Logger logger = Logger.getLogger(Icons.class);
public static final Icon OK = icon("/icons/add.png");
public static final Icon CANCEL = icon("/icons/cancel.png");
private static Icon icon(String path) {
URL resource = Icons.class.getResource(path);
if(resource==null) {
logger.error("Resource "+path+" does not exist");
return new ImageIcon();
}
return new ImageIcon(resource);
}
}
解決
アイコンを静的定数として保持したい場合は、ImageIcon オブジェクトのインスタンス化を静的メソッドに抽出します。
public static final Icon ok = icon("ok.png");
private static Icon icon(String path) {
URL resource = Icons.class.getResource("/icons/" + path);
if (resource == null) {
// Log something...
return null;
}
return new ImageIcon(resource);
}
こうすることで、何かが失敗したときはいつでも制御できるようになり、インスタンス化で同じことを繰り返す必要がなくなります。
また、定数も最終的なものにします。
より一般的なアプローチは、リフレクションを使用して Icons クラスを検査し、クラス内の各パブリック静的 Icon フィールドのリソースを読み込むことです。この方法では、新しい Icon 定数を宣言するだけで済み、対応するリソースが定数の名前に基づいて自動的にロードされます。これを行うためのヒントがさらに必要な場合は、コメントを残してください。
他のヒント
これには 2 つの問題があると思いますが、どちらも許容できるかもしれません。
- アイコンが見つからないか、何らかの理由でロードできない場合、デバッグが困難になります。静的イニシャライザで実行されるコードは、例外を「失う」のが簡単であるため、注意が必要な場合があります。
- このクラスはおそらく決してアンロードされないため、アイコンによって使用されるリソースは決して解放されません。
アイコンが常にそこにあることを確認でき、初期化を静的初期化ブロックに入れて適切な例外処理とログを追加することで回避できる場合は、おそらく 1 番が許容されます。
アイコンは通常、アプリケーションの実行時間全体を通じて使用され、いずれにしてもアプリケーションが終了するずっと前に解放されないため、おそらく 2 番が許容されます。
したがって、全体的にはそれでいいと思います。
定数を最終的なものとしてマークすることもできます。
それはかなり簡単な方法のようです。ただし、私は画像にその目的と同じ名前(「ok.png」、「cancel.png」)を付けます。また、画像を削除したり名前を変更すると問題が発生する可能性があることを明確にしてください。
これは標準的な方法のようですが、以前に問題が発生しました。
Maven で Eclipse を使用しており、これらのアイコンを Maven のリソース ディレクトリに保存している場合、Eclipse が自動ビルドのいずれかを実行するときに、アイコン ファイルは target/classes ディレクトリにコピーされません。これにより、アイコンが見つからない場合に実行時例外が発生します。
アイコンを適切な場所に配置するには、Maven パッケージを少なくとも 1 回手動で実行する必要があります。