以类似enum的方式组织常量组的好方法

时间:2016-06-20 22:58:13

标签: java

我正试图找到一种方法来组织一组仅用于不可变数据的常量值。

以下是我正在尝试的内容:

public class FishType {

    //PredatorFishType extends FishType
    public static final PredatorFishType SHARK = new PredatorFishType(5, 20, "Shark");
    public static final FishType CAT_FISH = new FishType("Cat Fish");

    private String name;

    private FishType(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

}

我使用反射将最终值收集到集合中。我过去习惯使用枚举,但是当不同类型的鱼发挥作用时被迫想到一种新的方法,例如包含食物等其他数据的捕食者。这些常量仅用于数据显示目的,没有理由进行变异。

如果有一种方法可以在同一个枚举中包含多个枚举类型(如果这有任何意义),那就太好了。

感谢阅读。

2 个答案:

答案 0 :(得分:1)

您可以使用构造函数重载或重载和包装类的组合。如果你肯定知道这些数据是不可变的并且总是这样,那么我就不会发现坚持枚举的错误。为了将它放入一个类中,我在EnumTester类中包含了枚举,但您可能不想这样做。

这是一个打印" Cat Fish 5 20 Shark"和"牛鱼"运行时,只使用枚举和包装类。您可以将访问者放在任何需要的位置,具体取决于您实际想要对信息执行的操作 - 我试图演示如何编写两个枚举,而不是如何使用它们。

package enums;

public class EnumTester
{
    public enum MainType {
        CAT_FISH("Cat Fish"), DOG_FISH("Dog Fish"), COW_FISH("Cow Fish");   //everything has a name...
        private String name;

        private MainType(String name){
            this.name = name;
        }

        public String getTypeDetails(){
            return name;
        }
    }

    public enum SubType {
        PREDATOR(5, 20, "Shark"), PREY(), MANATEE();    //but not everything has any additional information
        private boolean isFullSubType;
        private int val1;
        private int val2;
        private String subName;

        private SubType(int val1, int val2, String subName){
            this.isFullSubType = true;
            this.val1 = val1;
            this.val2 = val2;
            this.subName = subName;
        }

        private SubType(){
            this.isFullSubType = false;
            this.val1 = -1;
            this.val2 = -1;
            this.subName = "none";
        }

        public String getSubTypeDetails()
        {
            if( isFullSubType ) {
                return val1 + " " + val2 + " " + subName;
            }
            else {
                return "";
            }
        }
    }

    private MainType mainType;
    private SubType subType;
    public EnumTester(MainType mainType, SubType subType)
    {
        this.mainType = mainType;
        this.subType = subType;
    }

    public static void main(String[] args)
    {
        EnumTester kittyShark = new EnumTester(MainType.CAT_FISH, SubType.PREDATOR);
        System.out.println(kittyShark.printDetails());

        EnumTester cowManatee = new EnumTester(MainType.COW_FISH, SubType.MANATEE);
        System.out.println(cowManatee.printDetails());
    }

    public String printDetails(){
        return mainType.getTypeDetails()+" "+subType.getSubTypeDetails();
    }
}

答案 1 :(得分:0)

我通常遵循与您上面所做的相似的模式。我可能会让类FishTypes成为收集器,只是为了让FishType接口保持清洁。您还可以创建一些语法糖来帮助您收集已注册的FishTypes:

public static final Set<FishType> registeredFish = new HashSet<>();
public static final PredatorFishType SHARK = register(new PredatorFishType(5, 20, "Shark"));
public static final FishType CAT_FISH = register(new FishType("Cat Fish"));

public static <T extends FishType> T register(T fishType) {
    registeredFish.add(fishType);
    return fishType;
}