1

列挙型の拡張に近い要件がありますが、それは不可能であるため、オンラインで調査した後、インターフェイスを使用して列挙型を拡張するというこのアプローチを思い付きました。

私の問題は、いくつかの基本的なタイプ A、B と、それをチェックする必要があるかどうかを示す各タイプのフラグがあることです。同様に、フラグをチェックした後に同じことを行う拡張型 C がいくつかあります。

これを行うコードは次のとおりです

型インターフェイス:

public interface Type {

    public String name();

}

基本型を使用するクラスは次のとおりです

public class BasicChecker {

    private static boolean checkA = false;
    private static boolean checkB = false;

    public enum BasicType implements Type {
        A, B;
    }

    public static boolean isCheckA() {
        return checkA;
    }

    public static void setCheckA(boolean checkA) {
        BasicChecker.checkA = checkA;
    }

    public static boolean isCheckB() {
        return checkB;
    }

    public static void setCheckB(boolean checkB) {
        BasicChecker.checkB = checkB;
    }

    public static void doStuff(String message, Type type) {
        if (type.name().equalsIgnoreCase(BasicType.A.name())) {
            doStuff(message, isCheckA());
        } else if (type.name().equalsIgnoreCase(BasicType.B.name())) {
            doStuff(message, isCheckB());
        }
    }

    protected static void doStuff(String message, boolean flag) {
        if (someCheckMethod() && flag) {
            doStuff(message, flag);
        }
    }

    private static boolean someCheckMethod() {
        return false;
    }
}

そして、これは拡張型を使用するクラスです

public class ExtendedChecker extends BasicChecker {

    private static boolean checkC = false;

    public enum ExtendedType implements Type {
        C;
    }

    public static boolean isCheckC() {
        return checkC;
    }

    public static void setCheckC(boolean checkC) {
        ExtendedChecker.checkC = checkC;
    }

    public static void doStuff(String message, Type type) {
        BasicChecker.doStuff(message, type);
        if (type.name().equalsIgnoreCase(ExtendedType.C.name())) {
            doStuff(message, isCheckC());
        }
    }
}

私が今解決しようとしているのは、すべての if else ケースを log メソッドから削除することです。また、これを行うためのより良い方法があるかどうかを確認しようとしています。統計は無視してください。それらを静的フィールドとメソッドにしたいのです。

4

2 に答える 2

4

あなたの説明からあなたがやろうとしていることを正確に理解するのに苦労していますがabstract、 s のメソッドenumが役立つかもしれません。

たとえば、abstractメソッド「foo」をenumsに追加できます。

public enum BasicType implements Type {
    A {
        public void foo(String message) {
            // Do special A stuff
        } 
    }, B {
        public void foo(String message) {
            // Do special B stuff
        } 
    };

    public abstract void foo(String message);
}

そして、そのメソッドを次のように使用できます。

public static void doStuff(String message, Type type) {
    type.foo(message);
}

abstract当然、便利な場合は、そのようなメソッドをinterfaceyouに入れることができますextend

于 2013-06-27T02:34:24.973 に答える
0
public class BasicChecker {
  private static final Set<Type> _doCheck = Collections.newSetFromMap(new ConcurrentHashMap<Type,Boolean>());

  public enum BasicType implements Type {
    A, B;
  }

  public static boolean isCheck(Type type) {
    return return _doCheck.contains(type);
  }

  public static void setCheck(Type type, boolean check) {
    if(check) {
      _doCheck.add(type);
    } else {
      _doCheck.remove(type);
    }
  }

  public static void doStuff(String message, Type type) {
    doStuff(message, isCheck(type));
  }
}
于 2013-06-27T02:58:15.847 に答える