我正试图找到一种方法来组织一组仅用于不可变数据的常量值。
以下是我正在尝试的内容:
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;
}
}
我使用反射将最终值收集到集合中。我过去习惯使用枚举,但是当不同类型的鱼发挥作用时被迫想到一种新的方法,例如包含食物等其他数据的捕食者。这些常量仅用于数据显示目的,没有理由进行变异。
如果有一种方法可以在同一个枚举中包含多个枚举类型(如果这有任何意义),那就太好了。
感谢阅读。
答案 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;
}