【问题标题】:Should i pass an enum as a parameter or pass its literal value我应该将枚举作为参数传递还是传递其文字值
【发布时间】:2011-09-13 06:31:55
【问题描述】:

在设计一些接口和类时,我一直在考虑是否应该将枚举作为参数或它的字面值传递。

在这个时刻,我完全赞成传递它的字面值,因为我在某个地方读到过关于传递枚举的耦合问题。

有人对此有意见吗? :)

public enum Item{
CANDY("candy"), APPLE("apple");
}
  1. 通过枚举传递

    public buy(Item item){}
    
  2. 按字面值传递

    public buy(String itemValue){}
    

干杯。

【问题讨论】:

标签: java enums parameter-passing


【解决方案1】:

枚举是类,但具有一组预定义的值。因此,您必须声明枚举并为其实例提供一个变量。

试试这个例子:

public class ItemDemo {

public enum Item { 
    CANDY("candy"), APPLE("apple"); 
   }

CANDY c;
APPLE a;

public ItemDemo(String name, int age, double money, CANDY c, APPLE a) {
       this.c= c;
       this.a= a;
     }
   }

【讨论】:

  • 你好,我不太明白这个。什么是声明 anum 并为其实例提供变量?你的意思是在枚举类中我们有成员数据吗?
  • -1:枚举条目不是类型。这甚至还没有接近编译。
【解决方案2】:

我建议传递枚举值,因为它的类型更强。在您的示例中,如果“candy”和“apple”是“buy”方法的唯一有效参数,您可以在编译时通过要求枚举而不是字符串作为方法参数来强制执行。

【讨论】:

    【解决方案3】:

    在大多数情况下,我会传递实际的 Enum 类型(在此示例中为 Item)而不是 String 表示形式。这可确保正确键入,这也是 Enums 的目的。

    您可能想要传递字符串表示形式(从Enum.name() 获得)的一种情况是由于序列化/版本控制问题。

    例如,如果您有多个正在运行的应用程序实例,并且您不能始终确保它们运行相同的版本,您可能只想在它们之间传递字符串表示,并尝试手动反序列化它们(使用valueOf()) 并以这种方式处理任何差异。

    【讨论】:

      【解决方案4】:

      肯定是通过枚举。我的理由是:

      1. buy 的实现中使用枚举对象而不是字符串会容易得多。例如,如果您确实需要进行切换等。
      2. 更好的可维护性。如果您确实更改了字符串表示形式或可用的枚举值,您可以轻松查看是否破坏了任何内容,而将其转换为 String 时则不那么容易看到。
      3. 稍后查看buy 的实现时,您将很容易看到如何处理每个不同的枚举值。当您将其作为String 传递时,您可能不知道查看该方法所有可能的输入值是什么以及如何处理它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 2011-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多