java - 以类似枚举的方式组织常量组的好方法

标签 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;
    }

}

我也使用反射将最终值收集到集合中。我曾经使用枚举,但当不同类型的鱼(例如包含食物等其他数据的捕食者)发挥作用时,我被迫考虑一种新的方法来做到这一点。这些常量仅用于数据显示目的,没有理由进行改变。

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

感谢您的阅读。

最佳答案

您可以使用构造函数重载或重载与包装类的组合。如果您确定这些数据是不可变的并且将永远如此,那么我认为坚持使用枚举没有任何问题。为了将其放入一个类中,我已将枚举包含在 EnumTester 类中,但您可能不想这样做。

下面是一个在运行时打印“Cat Fish 5 20 Shark”和“Cow Fish”的示例,仅使用枚举和包装类。您可以将访问器放在任何需要的地方,具体取决于您实际想要对信息执行的操作 - 我试图演示如何组合这两个枚举,而不是如何使用它们。

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();
    }
}

关于java - 以类似枚举的方式组织常量组的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37933110/

相关文章:

java - 如何在函数中定义升序整数?

java - 如何运行 Jcalltracer

java - 通过Java程序将字符串(包含时区)插入SQL Server 2008中的datetimeoffset列

java - Firebase 允许在时间戳内插入

java - 如何调用Selenium到另一个类: NullPointerException

java - Hibernate多态性

java - oncreate() 之前调用了什么

java - 如何在 Java 中使用 XPath 获取属性值?

java - HashMap put 和 get 方法中参数的不同类型

java - 在 Spring Batch 中使用 split 限制线程数