0

私はいくつかの定数を作成しており、それぞれにいくつかの一意の名前のパブリック定数フィールドがあります。これは私がやろうとしていることですが、以下の例の T1 が匿名クラスであるため、コンパイルできません。

public class Templates {

    public static class Template {}

    public static final Template T1 = new Template(){

        public final String NAME = "My Name";
    };

    public static final Template T2 = new Template(){

        public final String THING1 = "This is a thing.";
        public final String THING2 = "This is another thing.";
    };

    public static void main(String[] args){
        System.out.println(T1.NAME); // does not compile
    }
}

上記の作業を行うための何らかの方法、または適切な代替アプローチのいずれかを探しています。各テンプレートには、異なる名前を持つ異なる数の定数があります。どんな助けでも大歓迎です!


これまでのところ、私が見つけた最良の代替案はシングルトン デザイン パターンを使用することですが、コードの負荷が少ない方法を知っている人がいれば、ぜひ知りたいです。

4

4 に答える 4

0

実際、意図したことに最も近いのは、内部クラスまたはより良いインターフェイスを定義することです。クラスを定義する場合は、クラス メンバーを静的に設定する必要があります。

public class Templates {


    public static interface T1 {

        public final static String NAME = "My Name";
    };

    public static interface T2{

        public final String THING1 = "This is a thing.";
        public final String THING2 = "This is another thing.";
    };

    public static void main(String[] args){
        System.out.println(T1.NAME); // DOES compile
    }
}

ところで、文字列定数を使用する代わりに、それらを列挙型に置き換えることもできます。

于 2013-09-06T16:29:55.717 に答える
0

このブログ投稿を参照すると、列挙型は単純な静的最終クラスです。唯一の違いは、次のように書く必要がないことです。

public class Direction extends java.lang.Enum{
    public final static Direction NORTH;
    ...

    static{
        NORTH = new Direction("NORTH", 0);
        ...

        VALUES = new Direction[(size here)];
        VALUES[0] = NORTH;
        ...
    }
} // taken from the referred blogpost

コードを 1 行書くだけで、enum Direction{}上記のすべてのものを取得できます。

これが意味することは、クラスを処理する方法で列挙型を処理できるということです。

列挙型に任意のメソッドを追加できます。

public enum TestEnums {
    TEST_ENUM_1;

    void doSomething(){
         System.out.print("I'm a method in enum");
    }
}
TestEnums.TEST_ENUM_1.doSomething(); //to call the method

列挙型にフィールドを追加できます:

public enum TestEnums {
    TEST_ENUM_1;

    String message = "I'm a field in enum";

    void doSomething(){
         System.out.print(message);
    }
}

列挙型でコンストラクターを使用できます。

public enum TestEnums {
    TEST_ENUM_1("I'm a field in enum 1"),
    TEST_ENUM_2("I'm a field in enum 2");

    String message;

    TestEnums(String message){
        this.message = message;
    }

    void doSomething(){
         System.out.print(message);
    }
}

列挙型にインターフェースを実装させることができます:

public enum TestEnums implements IEnum{
    TEST_ENUM_1("I'm a field in enum 1");

    String message;

    TestEnums(String message){
        this.message = message;
    }

    public void doSomething(){
         System.out.print(message);
    }
}

interface IEnum{
    void doSomething();
}

ただし、列挙型は最終的なものであるため、拡張できないことに注意してください。

これらすべてを使用して、グループ、フィールド、およびメソッドで必要な動作を実装し、シングルトンとコンパイラ チェックを無料で取得できます。列挙型のインターフェイスを使用すると、列挙型が提供する操作の数を簡単に拡張したり、代わりに別のクラスを使用したりすることもできます。

于 2013-09-07T12:18:14.600 に答える
0

テンプレートで変数を宣言し、匿名クラスから初期化する必要があるよりも、匿名クラスを使用する必要がある場合は、醜いですが可能です:-

class Templates {

public static class Template {

    public String Name;
    public String THING1;
    public String THING2;
}


public static final Template T1 = new Template() {

    {
        Name = "My Name";
    }
};

public static final Template T2 = new Template() {
    {
        THING1 = "This is a thing.";
        THING2 = "This is another thing.";
    }


};

public static void main(String[] args) {
    System.out.println(T1.Name); // compiles now
}
}
于 2013-09-05T22:39:39.023 に答える