【问题标题】:How to store and reuse a group of related constant values in Java?Java中如何存储和复用一组相关的常量值?
【发布时间】:2020-01-03 10:13:25
【问题描述】:

假设我有一个 Dog 类,它有很多属性,例如头发颜色、重量、长度、宽度

然后我有一个狗品种的枚举,比如DogType.MASTIFF

所以如果我要实例化一只狗,我可以拥有Dog dog = new Dog(DogType.POODLE)

我这样做是为了在方法相同的情况下不必为每种类型的狗设置单独的类,只是属性发生变化

所以在狗的构造函数中你会有

switch(DogType){
    case MASTIFF:
      this.weight = 5
      this.height = 10
}
...

但是,这会导致 Dog 类的构造函数非常庞大且笨拙。

我要问的是有没有一种方法可以为每个枚举定义很多常量值?因此,代替那个 switch 语句,它就像在给定 DogType 的构造函数中一样,您可以使用 DogType.WEIGHT

或代码DogType.MASTIFF.WEIGHT中其他地方的特定类型

我觉得我错过了什么。在其他语言中,我只会制作一种常量字典。

【问题讨论】:

  • 为什么不想为每只狗设置一个类并从超类(Dog)继承?
  • 我不认为通过switchenum 的属性硬编码体重和身高可以被认为是一个好的(和灵活的)解决方案,但我不知道你的确切的要求...
  • @brinck 因为数据不应该被继承。改用合成。
  • @brinck 在这种情况下,数据并不意味着被继承。即使是这样,我也可能想要一个恒定的事实来源,以了解某种狗类型的所有属性都打算在程序的其他地方使用
  • @user3124306 好的,在这种情况下,如果将枚举与下面提到的构造函数一起使用。

标签: java data-structures enums constants


【解决方案1】:

在构造函数中使用枚举:https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
在你的情况下:

public enum DogType {
POODLE(2, 20), MASTIFF(40, 45);

private int weight;
private int height;

DogType(int weight, int height) {
    this.weight = weight;
    this.height = height;
}

public int getWeight() {
    return weight;
}

public int getHeight() {
    return height;
}
}

然后将适当的枚举传递给您的方法并调用 getter。

【讨论】:

    【解决方案2】:

    我猜您正在寻找的是抽象生成器模式。这里给出了很好的模式解释:https://sourcemaking.com/design_patterns/builder/java/2

    因此,对于您的情况,前提是您有一个狗类型的枚举:

    public enum DogType {
      MASTIFF,
      SOMEOTHERTYPE;
    }
    

    你可以这样创建你的类:

    abstract class DogBuilder {
        public abstract Dog get();
    
        public DogBuilder getDogBuilder(DogType type) {
           switch(DogType){
              case MASTIFF:
                 return new MastifDogBuilder();
              case SOMEOTHERTYPE:
                 return new SomeOtherDogBuilder();
            }
        }
    }
    
    /* "ConcreteBuilder" */
    class MastifDogBuilder extends DogBuilder {
    
        public Dog get() {
            dog = new Dog();
            dog.setHeight(10);
            dog.setWeight(5);
            return dog;
        }
    
    }
    
    /* "ConcreteBuilder" */
    class SomeOtherDogBuilder extends PizzaBuilder {
        public Dog get() {
            dog = new Dog();
            dog.setHeight(20);
            dog.setWeight(5);
            return dog;
        }
    }
    

    【讨论】:

    • 嗯,直到我使用这种设计模式,但是我认为将属性存储在 Enum 中仍然更简洁,就像在另一个答案中一样 - 所以我会同时使用这两个答案跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2013-04-06
    • 1970-01-01
    • 2014-04-23
    • 2014-04-11
    • 2019-11-29
    相关资源
    最近更新 更多