【发布时间】:2010-03-19 19:57:34
【问题描述】:
我需要对各种原始类型执行算法;该算法本质上是相同的,只是变量的类型不同。比如,
/**
* Determine if <code>value</code> is the bitwise OR of elements of <code>validValues</code> array.
* For instance, our valid choices are 0001, 0010, and 1000.
* We are given a value of 1001. This is valid because it can be made from
* ORing together 0001 and 1000.
* On the other hand, if we are given a value of 1111, this is invalid because
* you cannot turn on the second bit from left by ORing together those 3
* valid values.
*/
public static boolean isValid(long value, long[] validValues) {
for (long validOption : validValues) {
value &= ~validOption;
}
return value == 0;
}
public static boolean isValid(int value, int[] validValues) {
for (int validOption : validValues) {
value &= ~validOption;
}
return value == 0;
}
如何避免这种重复?我知道没有办法泛化原始数组,所以我的双手似乎被束缚了。我有原始数组的实例,而不是说 Number 对象的盒装数组,所以我也不想走那条路。
我知道关于数组、自动装箱等方面的原语有很多问题,但我还没有看到它以这种方式表达,我还没有看到关于如何交互的决定性答案这些数组。
我想我可以这样做:
public static<E extends Number> boolean isValid(E value, List<E> numbers) {
long theValue = value.longValue();
for (Number validOption : numbers) {
theValue &= ~validOption.longValue();
}
return theValue == 0;
}
然后
public static boolean isValid(long value, long[] validValues) {
return isValid(value, Arrays.asList(ArrayUtils.toObject(validValues)));
}
public static boolean isValid(int value, int[] validValues) {
return isValid(value, Arrays.asList(ArrayUtils.toObject(validValues)));
}
这样真的好多了吗?这种方式将创建比原始实现更多的对象,尽管它会干掉源代码。对此问题的任何想法将不胜感激。
【问题讨论】:
-
好问题。尽管我看不到使用泛型的方法,但在完全不相关的注释中,考虑到迭代是在 1.5 语法中管理的方式,我猜你正在为每个数字进行自动装箱。我猜只做旧式数组计数会更快。
-
@I82Much:在这里查看我的回答和 Tom Hawtin 的评论:stackoverflow.com/questions/2337170/… 基本上没有“简单”的方法。您要么必须处理大量的重复,要么使用自定义预处理器或源代码检测或某些模板系统。甚至 Sun 也在使用这种技术这一事实证明了它是有用的。基本上,这也是令人惊叹的 Trove 原语集合的做法。请参阅 polygenelubricants 的问题和我 +5 赞成/接受的答案。
标签: java