【发布时间】:2013-08-22 16:25:03
【问题描述】:
我想创建一个采用enum 并直接在计算中使用它的方法
private static int getEntries(List<Integer> vector, Sign sign)
{
//assert isPrimitiveTypeCompliant(vector) : "Vector has null components!";
int entries = 0;
for (Integer entry : vector)
if (entry * sign > 0) // does not compile
entries++;
return entries;
}
我想……这样是可能的,因为我假设 System.out.println(Object) 也进行隐式类型转换。它没有,它使用以下方法:
public void println(Object x) {
String s = String.valueOf(x);
synchronized (this) {
print(s);
newLine();
}
}
public static String valueOf(Object obj) {
return (obj == null) ? "null" : obj.toString();
}
问题
那么有可能在java中实现吗?还是保留给C++ 和运算符重载?常见的解决方法是什么?完成工作的实用程序/适配器类?
顺便说一句,我最终采用了这种方法
private enum Sign
{
POSITIVE(+1), NEGATIVE(-1);
private int sign;
private Sign(int sign)
{
this.sign = sign;
}
public int process(int n)
{
if (n * sign > 0)
{
return n;
}
return 0;
}
}
private static int getEntries(List<Integer> vector, Sign sign)
{
//assert isPrimitiveTypeCompliant(vector) : "Vector has null components";
int entries = 0;
for (Integer entry : vector)
entries += sign.process(entry);
return entries;
}
【问题讨论】:
-
sign.ordinal()是一个选项。 -
我认为 Josh Bloch 写道,普通开发人员不应该依赖
ordinal()函数。但具体原因我忘了。 -
枚举基本上是一个集合,而不是一个列表。集合本质上不是有序的,其他开发人员倾向于对它们重新排序。事实上,他们做到了!!!
-
原因是如果你使用序数,那么当你扩展枚举时,你只能在末尾添加值,不能在中间或其他地方,否则你会破坏所有依赖于序数的东西.这是在工作中来之不易的经验,有一段时间我们将序数存储在数据库表等中。这使得代码的灵活性远远低于应有的灵活性。我们现在已经承诺不对新代码使用序数。
-
@MarioRossi 你打赌。在我刚开始在公司时,序数被广泛使用,我不得不四处向许多人解释为什么这是一个糟糕的想法。它不仅禁止在除末尾之外的任何地方添加值,而且当您有多个必须合并的分支(将新值添加到同一个枚举)时,至少其中一个可以保证打破“添加在末尾" 规则。
标签: java casting type-conversion implicit-conversion