Arv*_*nem 7 java enums multiple-constructors subclassing
鉴于有限数量的项目有所不同,用堆叠的枚举和枚举构造函数表示它们还是将它们子类化更好?或者是否有更好的方法?
为了给你一些背景,在我的小RPG程序中(具有讽刺意味的是简单),角色在他或她的库存中有不同种类的物品.项目因类型,用途和效果而异.
例如,一个库存项目是一个名为Gremlin的拼写滚动,用于调整Utility属性.另一件物品可能是一把名为Mort的剑,用于战斗并造成伤害.
在我的RPG代码中,我现在尝试了两种表示库存项目的方法.一个办法是子类(例如,InventoryItem - >拼写 - > AdjustingAttributes; InventoryItem - >武器 - >剑)并在需要时实例化每个子类,以及诸如像的Gremlin和莫特名称分配值.
另一种方法是堆叠枚举和枚举构造函数.例如,我为itemCategory和itemSpellTypes以及itemWeaponTypes创建了枚举,而InventoryItem枚举是这样的:
public enum InventoryItem {
GREMLIN(itemType.SPELL, itemSpellTypes.ATTRIBUTE, Attribute.UTILITY),
MORT(itemType.WEAPON, itemWeaponTypes.SWORD, 30);
InventoryItem(itemType typeOfItem, itemSpellTypes spellType, Attribute attAdjusted) {
// snip, enum logic here
}
InventoryItem(itemType typeOfItem, itemWeaponTypes weaponType, int dmg) {
// snip, enum logic here
}
// and so on, for all the permutations of items.
}
Run Code Online (Sandbox Code Playgroud)
是否有比这两种方法更好的Java编程实践?或者,如果这些是唯一的方式,哪两个更好?提前感谢您的建议.
如果唯一保持静态数据和非常小的逻辑(最好没有逻辑),枚举是好的.如果您的对象根据其类型而具有不同的行为,那么将它们作为子类实现通常是个好主意.
正如其他人所提到的,您很可能会为对象添加属性,而这些属性对于所有类型都没有意义.例如.颜色属性对于武器有意义,但对于法术则没有意义.在这种情况下,武器和法术不应该在同一个枚举中.
如果要向项添加新属性,可以更容易地将它们实现为子类.这样,如果一组项获得一个新属性,它将传播到所有子类.
例如,如果所有类型Weapon
都分配了一定的权重,则只需将该属性添加到该类即可.然后,此属性将传播到子类.
关于其他更静态的东西,因此可以直接分配类型,枚举是好的.我在这里自由思考,所以我猜一个Weapon
可以DamageType
分配到它:
public abstract class Weapon {
public enum DamageType {
CUT,
SMASH,
PIERCE;
}
private DamageType damageType;
Run Code Online (Sandbox Code Playgroud)
在您描述的上下文中,我将考虑使用类层次结构而不是枚举定义,并使用接口补充此层次结构; 例如
/**
* Root of class hierarchy.
*/
public interface InventoryItem {
}
/**
* Additional "parallel" interface implemented by some (but not all)
* InventoryItems and other non-inventory items.
*/
public interface Usable {
void use();
}
/**
* A Spell is in InventoryItem and is also Usable.
*/
public abstract class Spell implements InventoryItem, Usable {
}
public class Gremlin extends Spell {
}
/**
* A Door is *not* an InventoryItem but can be used.
*/
public class Door implements Usable {
}
Run Code Online (Sandbox Code Playgroud)
这种方法的主要优点是它允许您在不同的上下文中处理给定对象(如InventoryItem
s或Usable
s 列表).我要避开枚举的另一个原因是你很可能在你的项目上定义行为(例如spell.cast(Person)
),这并不适用于枚举恕我直言.
归档时间: |
|
查看次数: |
1650 次 |
最近记录: |