-1

私の質問が少し不明確な場合は申し訳ありません。文言を探すのは少し難しいと思います。Eclipse をいじったり、JavaDoc や Google、SO を調べたりするのに数時間費やしました。多くのことを学びましたが、答えが見つかりませんでした。

私ができるようにしたいのは、列挙型を定義することです。

public enum Animals {
    Cow,
    Chicken,
    Sheep,
    Horse;
}

各列挙型定数に、ローカル クラスではないインスタンス化可能なクラスを定義させます。以下は機能しますか?そうでない場合、その理由は何ですか?

いくつかのファイルで:

abstract public class Animal {

    private String nameString;

    public String getName() {
        return nameString;
    }

}

別の場合:

public enum Animals {

    Cow ((new Animal() {
        private boolean hasMilk;
        {
            nameString = "Cow";
            hasMilk = false;
        }
        public boolean hasMilk() {
            return hasMilk;
        }
    }).getClass()),

    Chicken ((new Animal() {
        private boolean hasFeathers;
        {
            nameString = "Chicken";
            hasFeathers = true;
        }
        public boolean hasFeathers() {
            return hasFeathers;
        }
    }).getClass()),

    Sheep ((new Animal() {
        private boolean isShorn;
        {
            nameString = "Cow";
            isShorn = false;
        }
        public boolean isShorn() {
            return isShorn;
        }
        public void Shear() {
            isShorn = true;
        }
    }).getClass()),

    Horse ((new Animal() {
        {
            nameString = "Cow";
        }
    }).getClass());


    private Class<? extends Animal> animalClass;

    private Animals(Class<? extends Animal> a) {
        animalClass = a;
    }

    public Class<? extends Animal> getAnimalClass() {
        return animalClass;
    }
}

そして、他のクラスの他のメソッドで、これを行うことができます:

Animal farmAnimal;
farmAnimal = Animals.Sheep.getAnimalClass().newInstance();
boolean shorn = farmAnimal.isShorn();

(この時点でshornの価値);false

farmAnimal.shear();
shorn = farmAnimal.isShorn();

( shorn == true)

farmAnimal = Animals.Sheep.getAnimalClass().newInstance();
shorn = farmAnimal.isShorn();

( shorn == false)

明らかに、これは私がここで行ったことを実行する最善の方法ではありませんが、それは重要ではありません。enum 定数の動作を指定できることはわかっていますが、それによってそれらが別個のインスタンスとして複数インスタンス化可能になるわけではありません。さまざまなインスタンス変数 (およびインスタンス変数のさまざまな量/タイプ) とさまざまなアクセサー メソッドを使用して、さまざまな列挙型定数の複数のインスタンス (またはコピー) を作成できるようにしたいと考えています。列挙定数を変更せずに。

列挙型定数は不変になるように設計されていることがわかりました。それは私の考えと衝突しません。各列挙型定数が、可変クラスの不変定義を表すようにしたいと考えています。

4

1 に答える 1

2

次のようなことができます。

public enum AnimalType {
    COW {
        @Override
        public Animal createNew() {
            return new Cow();
        }
    },
    HORSE {
        @Override
        public Animal createNew() {
            return new Horse();
        }
    };

    public abstract Animal createNew();
}

public abstract class Animal {
    private final AnimalType type;
    private final String nameString;

    public Animal(final AnimalType type, final String nameString) {
        super();
        this.type = type;
        this.nameString = nameString;
    }

    public String getName() {
        return nameString;
    }

    public AnimalType getType() {
        return type;
    }
}

public class Horse extends Animal {
    public Horse() {
        super(AnimalType.HORSE, "Horse");
    }
}

public class Cow extends Animal {
    private boolean milk;

    public Cow() {
        super(AnimalType.COW, "Cow");
    }

    public boolean hasMilk() {
        return milk;
    }

    public void setMilk(final boolean milk) {
        this.milk = milk;
    }
}

@Test
public void testEnum() {
    Cow cow = (Cow) AnimalType.COW.createNew();
    Horse horse = (Horse) AnimalType.HORSE.createNew();

    System.out.println("cow  : " + cow.getType() + ", has milk: " + cow.hasMilk());
    System.out.println("horse: " + horse.getType());
}
于 2012-07-07T08:44:04.677 に答える