English 中文(简体)
静态变量应该用枚举替换吗?
原标题:
  • 时间:2009-01-29 10:32:34
  •  标签:

所以我在查看一些检入的代码时感到很困惑:

// Amount of days before cancellation can t be done
enum Cancellation { Limit = 2 };

询问检查它的那个人,他认为使用枚举比静态变量更好,更优越。

private static int CANCELLATION_LIMIT = 2;

所以我们开始争论。我的观点是他使用枚举作为存储值的一种方式(如果有两个枚举符号具有相同的值,它会出现错误)。他争辩说在类中有静态变量是一种反模式。

我的问题是应该用什么最佳实践呢?

最佳回答

枚举是有类型的。

That is, if you have a method where you have to pass a certain state to a method for instance, you can only pass valid arguments. For instance:

enum OrderState 
{
  pending = 1,
  shipped = 2
}

public IList<Order> GetOrdersInState( OrderState )
{
}

This is a good example -imho- of using enums. When OrderState is an int for which you create 2 const ints, you have no restriction and are able to pass invalid values. The compiler won t complain.

然而,您提出的案例,我认为使用枚举不是一个有效的解决方案。这是对int的错误使用,应使用const int。

Enums are good, but they should be used where they must be used. They re not the preferred tool in every situation. Having a const or static var is in this case not an antipattern.

问题回答

这是一个逻辑值集吗?是的话,“枚举”就合适了;否则,“静态常量”也可以。

我是一个逻辑一致的大粉丝。

不,你如何在枚举中定义静态字符串变量或十进制值?

我不认为CANELLATION_LIMIT听起来像枚举,而枚举通常是一组选择。

如果它是一个const,或许会有所不同……但目前它是一个可变的字段?

请注意,枚举仅限于基于整数的类型,因此无法用于 floatstring 等。

对于意图独特不变的值,枚举是一种选择。需要问的问题很简单:对象应该存储值本身吗,即使是静态的?在许多情况下,例如描述错误或操作时,答案是否定的。请记住,枚举诞生是为了替代#define:它将典型值与标识符关联起来,并提供一种类型,它并不实际上说“将此常量存储在这里”。

我推测您实际上并不想存储任何东西,而是提供典型的值。只有当您打算将它们用作这样的成员时,静态常量成员才有用,例如,如果您需要通过引用将它们传递给方法。

如果您有一组直接连接的值,我认为应该使用枚举。

类似于:枚举状态 { 打开 = 1,关闭 = 2,等待 = 3 };

对于其他所有情况,我会说静态变量是正确的选择。

我不知道在类中有静态变量是一种反模式(?)。例如,.Net框架中的Color类具有很多静态公共变量,例如Color.Red。因此,从这个角度来看,我同意你的观点。

然而,可能有一个妥协:使用私有常量CANCELLATION_LIMIT = 2; 然后你们两个都会很高兴。对于他而言,类中没有全局变量(?), 因为常量会被编译器替换,而你将得到一个清晰名称的单一修改点。





相关问题
热门标签