【问题标题】:get() methods in Java enum typeJava 枚举类型中的 get() 方法
【发布时间】:2012-07-24 20:37:58
【问题描述】:

我有一个枚举类型(例如,为了参数的缘故CarModel),在整个应用程序(许多类)中使用。

public enum CarModel {
    DIABLO,
    P911,
    DB7;
}

我有各种方法以不同的方式使用此CarModel 枚举类型,并且每个方法都有一个 switch 语句来根据枚举类型设置一些 String 变量,然后再继续执行其他操作。 (例如,设置某些型号的制造商,或设置原产国等。这些结果在运行时是静态的)

问题是,如果我想向枚举添加一个新模型,我需要转到每个方法,并扩展/修改 switch 语句以处理它的存在。这很容易导致人为错误和/或代码重复(如果各种方法使用相同的 switch 语句)。

我希望使用静态方法,而不是全部使用 switch 语句,可以在单个位置进行编辑,并允许类似于以下的行为:

String country = CarModel.DIABLO.getCountry() // returns Italy
String manufacturer = CarModel.P911.getManufacturer() // returns  Porsche

这可以通过枚举实现吗,(枚举甚至是“正确”的方法吗?

【问题讨论】:

    标签: java enums


    【解决方案1】:

    你可以这样做。

    public enum CarModel {
        DIABLO("Lamborghini", "Italy"),
        P911("Porsche", "Germany");
    
        private String manufacturer;
        private String country;
    
        private CarModel(String manufacturer, String country) {
            this.manufacturer = manufacturer;
            this.country = country;
        }
    
        public String getManufacturer() {
            return manufacturer;
        }
    
        public String getCountry() {
            return country;
        }
    }
    

    【讨论】:

    • 我一直这样做,非常喜欢枚举的这些特性。
    【解决方案2】:

    是的,当然。枚举可以有自己的方法,并且这些方法可以是特定于值的。它看起来像这样:

    enum CarModel {
        P911 {
            public String getManufacturer() { return "Porsche"; }
        },
        DB7 {
            public String getManufacturer() { return "Aston Martin"; }
        },
        ...
        public abstract String getManufacturer();
    }
    

    当然,您可以添加更多方法。

    【讨论】:

      【解决方案3】:

      如果你要使用枚举,我建议在枚举中声明一个抽象方法,然后为每个枚举实例提供一个实现。

      这样您就不会到处都有 switch 语句(您可以从中轻松省略案例),并且您拥有更可靠和 OO 风格的 polymorphic 方法。

      abstract public int getEngineSize();
      
      DIABLO {
         public int getEngineSize() {
            return 6.3; // whatever it really is...
         }
      }
      

      有关更多示例/讨论等,请参阅here

      【讨论】:

      • @NimChimpsky:这并不奇怪,因为像 korgen 展示的其他方法更简单,使用的代码更少。
      • @A.H.我想是的,他们完成了同样的事情,但这很奇怪,而且可读性较差 - 我错过了他们的任何实际优势吗?
      • 覆盖方法与设置参数的通常优点是:覆盖更冗长,但允许您更改算法。例如,如果有一个enum BinaryOperator,每个运算符可以不同地定义double apply(double, double)。然而,在这里,我们正在处理数据,因此将不同的参数传递给构造函数是完全足够的。
      【解决方案4】:

      我建议将此信息直接添加到您的枚举中。

      像这样:

      public enum CarModel {
      
          DIABLO("Lambo"),
          P911 ("Porsche");
      
          private String manufacturer;
      
      
          private CarModel(String manufacturer) {
              this.manufacturer = manufacturer;
          }
      
          public String getManufacturer() {
              return manufacturer;
          }    
      }
      

      在课程中你只需要使用 getManufacturer 方法

      【讨论】:

        【解决方案5】:

        此外,枚举可以实现接口。您可以添加一些get() 方法,例如getMaxSpeed()getWeight()。 界面可以是这样的

        interface car{
        public int getMaxSpeed();
        public int getWeight();
        }
        

        【讨论】:

          【解决方案6】:

          是的,这很容易做到:

          public enum CarModel {
              DIABLO("rod"),
              P911("jane"),
              DB7("freddy");
          
              private String name;
              CarModel(String name){
                  this.name = name;
              }
          
              public String getName() {
                  return name;
              }
          }   
          

          【讨论】:

            【解决方案7】:

            哈哈,我推荐你使用“工厂”设计模式。

            你可以创建一个 CarFactory() 来生产新车型。

            http://en.wikipedia.org/wiki/Factory_method_pattern

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-09-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-12-22
              相关资源
              最近更新 更多