いろんな定数を宣言
まずは普通に
よく使うのが、プリミティブと文字列の定数
public class Const { private static final int MAX_INT = 100; private static final String NAME = "name"; }
Mapを定数に
あんまり使う場面は無いかもしれないけど、こんな感じ
import java.util.Collections; import java.util.HashMap; import java.util.Map; public class AnimalMain { private static final Map ANIMAL_MAP; static { HashMap map = new HashMap(); map.put("dog", "pochi"); map.put("cat", "tama"); ANIMAL_MAP = Collections.unmodifiableMap(map); } public static void main(String[] args) { ANIMAL_MAP.put("mouse", "hamtaro"); } }
Mapの場合はfinalにしても追加・変更はできるのでCollections#unmodifiableMapで追加をできないようにしておくと、変なことにはならないはず。
ただ、取得してきたインスタンスの変更はできてしまうので、結局、クラスは定数に使わないほうがいいかも…
ちなみに実行すると、UnsupportedOperationExceptionが発生。
java.lang.UnsupportedOperationException at java.util.Collections$UnmodifiableMap.put(Unknown Source) at AnimalMain.main(AnimalMain.java:15) Exception in thread "main"
Listを定数に
Mapとほぼ同じ
ANIMAL_LIST = Collections.unmodifiableList(list);
その他のクラスを定数化
Collections#unmodifiableMapのなかを見てみると、定数かしたいクラスをラップして、変更メソッドに例外を埋め込んでるようなので、こんな感じか。
// 定数として使うクラス public class Animal { private String name; private int size; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } } public class AnimalUtil { // 変更不可にするメソッド public Animal unmodifiable(Animal animal) { return new UnmodifiableAnimal(animal); } // ラッパクラス private static class UnmodifiableAnimal extends Animal { private final Animal animal; // コンストラクタ UnmodifiableAnimal(Animal animal) { this.animal = animal; } // インスタンスが変更されないメソッドは委譲 public boolean equals(Object obj) { return animal.equals(obj);} public String getName() { return animal.getName();} public int getSize() { return animal.getSize();} public int hashCode() { return animal.hashCode();} public String toString() { return animal.toString();} // インスタンスが変更されるメソッドは例外 public void setName(String name) { throw new UnsupportedOperationException();} public void setSize(int size) { throw new UnsupportedOperationException();} } }
結論
クラスは定数化しないほうがいいんじゃない?