如何使用特定的关联方法获得常量

时间:2015-01-27 22:26:08

标签: java

假设您有一些用于存储游戏中攻击信息的类(这不是我的用例,但实际上是类似的,也是我能想到的最容易理解的类比)。每次攻击都有一个名称(String)和一个strength(int)(可能还有其他字段,但这只是一个例子)。并且您想要某种方式来访问有关游戏中每一步的信息。

对我来说,这很简单,可以使用Attack类来实现,然后将每个攻击作为Attack的最终实例存储在某些常量类Attacks中。

但是假设某些动作的strength在某些情况下会发生变化。对于非平凡的行为,我想可能需要一个特定的方法,它采用参数(发生所述变化的“情况”)会产生一些额外的影响,例如在某些情况下具有更高的strength,或者治愈用户,或削弱目标等。

我正在寻找解决需要什么是有效常量的问题的解决方案(所有攻击都严格按照行为进行定义),但有些人使用“可选”方法。

我已经考虑过使用功能接口/对象作为将这些方法“传递”到实际处理这些攻击使用的类的方法,但这看起来很笨拙,而且可能缺乏灵活性。

另一种可能的解决方案是拥有一个抽象的Attack类,其中包含必要的字段(namestrength等)以及指示是否表示给定攻击具有某种属性(所有不同的可能属性都存储在enum抽象类中的Attack中。然后,每个移动都将作为Attack的子类实现,其方法对应于上述集合中存在的每个属性。该解决方案提供了很大的灵活性,但是每个单独的移动都需要单独的类,这必须在存储和内存中收集(可能作为地图或集合)。

对这些想法或完全新想法的任何反馈都将不胜感激。

1 个答案:

答案 0 :(得分:6)

这是Java中 enum 的完美用法。您有少量固定数量的攻击类型,需要进行多态处理,并且需要自定义行为。

简单示例:

public enum Attack {
    MELEE(2) {
        @Override
        public int getDamage(int circumstances) {
            // customized behavior
        }
    },
    RANGED(1);

    private final int baseStrength;

    private Attack(int strength) {
        this.baseStrength = strength;
    }

    public int getDamage(int circumstances) {
        // default behavior for all attacks
    }
}