-1
對不起,如果我的問題有點不清楚;我發現找到措辭有點難。我花了幾個小時在Eclipse中搞定,巡航JavaDoc和Google,以及SO。我學到了很多,但沒有找到答案。是否有可能使用Enum常量作爲Java中的可實例化類的模板?
我想什麼,能夠做的就是定義一個枚舉,如:
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
)
很顯然,這不是做什麼,我在這裏所做的最好的方式,但是這不是問題的關鍵。我知道我可以爲枚舉常量指定行爲,但這並不能使它們作爲不同的實例進行多次實例化。我希望能夠使用不同的訪問器方法創建不同實例變量(以及不同的實例變量的數量/類型)的各種枚舉常量的多個實例(或副本),然後我可以執行這些操作(改變實例變量)不用修改枚舉常量。
我得到的是枚舉常量被設計爲不可變的。這與我的想法不衝突;我希望每個枚舉常量表示一個可變類的不可變定義。
感謝。就我所見,您的解決方案可以實現我所追求的最終結果,但它並不令人滿意。有可能我要求的語言功能並不存在。在一個相關的說明中,我有什麼理由不應該將動物聲明中的所有Animal子類聲明爲嵌套類?這件事(將類定義歸類爲枚舉常量)吸引了我的組織方面。 – 2012-07-07 08:54:59