/* 型に安全な定数
* サブクラスを不可にすることによりFontだけを
* ConstProxyに入れられるようにする
*/
class ConstProxy {
private Font font_;
private int value_;
public ConstProxy(Font font_, int value_) {
this.font_ = font_;
this.value_ = value_;
}
public boolean isHolding(Font font){
return font_ == font;
}
public int getValue(){
return value_;
}
}
public final class Font {
public static final Font PLAIN = new Font();
public static final Font BOLD = new Font();
private static List<ConstProxy> proxies_ = new ArrayList<ConstProxy>();
static {
// proxes_.add(new FishTank(), 0); // コンパイルエラー
proxies_.add(new ConstProxy(PLAIN, 0));
proxies_.add(new ConstProxy(BOLD, 1));
}
// Fontが他の場所で生成されることを防止する
private Font() { };
static int valueOf(Font font) {
ConstProxy constProxy = null;
Iterator<ConstProxy> it = proxies_.iterator();
while (it.hasNext()) {
constProxy = (ConstProxy) it.next();
if (constProxy.isHolding(font))
break;
}
return constProxy.getValue();
}
public class Tester {
public void test() {
// Fontの定数のみ許可
// constTest(FishTank.MAXIMUM_NUMBER_OF_FISH);
constTest(Font.PLAIN);
}
// 範囲チェックが不要になった!!
public void constTest(Font font) {
if (font == Font.BOLD) {
System.out.println("BOLD");
}
if (font == Font.PLAIN) {
System.out.println("PLAIN");
}
}
}
}
class FishTank {
public static final int MAXIMUM_NUMBER_OF_FISH = 10;
}
class CallFont {
public static void main(String[] args) {
System.out.println(Font.valueOf(Font.BOLD));
}
}