2010-09-04 59 views
0

我構建具有類似的數據結構枚舉值如下:建造這個物體的更好的模式?

enum MetaType { 
HUMAN(
    new MetaTypeAttribute(AttributeType.BODY, 1, 6), 
    new MetaTypeAttribute(AttributeType.AGILITY, 1, 6), 
    new MetaTypeAttribute(AttributeType.REACTION, 1, 6) 
), 
ORK(
    new MetaTypeAttribute(AttributeType.BODY, 4, 9), 
    new MetaTypeAttribute(AttributeType.AGILITY, 1, 6), 
    new MetaTypeAttribute(AttributeType.REACTION, 1, 6) 
); 

MetaType(MetaTypeAttribute body, MetaTypeAttribute agility, MetaTypeAttribute reaction) { 
} 
} 

因此,有元類型的枚舉;每個MetaType指定一組固定的MetaTypeAttributes,它由該屬性的最小值和最大值組成。

我討厭這種語法。它太長了,很醜,並且不會阻止我傳入錯誤的AttributeType(AttributeType應該與MetaType構造函數的參數順序相匹配; AttributeType.BODY> body等)。我想要的是一個更好的模式,以確保用這個確切的方案構建一個對象。

此代碼被縮寫。實際上有9個AttributeTypes。

任何改進建議?

回答

1
enum MetaType { 
HUMAN(new MyRange(1,1), new MyRange(1, 10), new MyRange(1,10) 
), 
ORK(new MyRange(1,1), new MyRange(1, 10), new MyRange(1,10) 
); 

MetaType(MyRange body, MyRange agility, MyRange reaction) { 
     this.bodyAttrib = new MetaTaypAttibute(AttributeType.BODY, body); 
     this.agilityAttrib = new MetaTaypAttibute(AttributeType.AGILITY, agility); 
     this.reactionAttrib = new MetaTaypAttibute(AttributeType.REACTION, reactiony);} 
} 
+0

謝謝!我最終使用這種模式。嚴格地說,當我這樣做時,我不需要MetaTypeAttribute對象;我只是存儲從構造器參數中填充的Map 。 – RMorrisey 2010-09-04 08:53:42

0

如果你考慮不同的屬性類型,也許你應該真的創建這些屬性類型作爲類/子類而不是枚舉。您將擁有OOP的所有優勢來處理每種類型的行爲(繼承方法,方法重寫,...),並且它們將是類型安全的。

abstract class AbstractTypeAttribute{ 
    private final int min, max; 
    public AbstractTypeAttribute(int min, int max){ 
     //... 
    } 
    //... 
} 

class Body extends AbstractTypeAttribute{ 
    public Body(int min, int max){ 
     super(min, max); 
     //... 
    } 
    //... 
} 

你應該考慮這樣做,而不是元屬性和元類型的了。

+0

您也可以繼承和覆蓋枚舉方法。枚舉是完全類型安全的。我在這裏看不到優勢。順便說一句,你的方法不提供常量。 – whiskeysierra 2010-09-04 08:32:59

+0

你不能繼承枚舉,它們事實上是最終的。枚舉是類型安全的,但不是枚舉內容,它不能用作類型。我不知道你在說什麼常數。 – 2010-09-04 08:36:37

相關問題