我想我必须接受Long
是final
并且无法延期。
在我们的项目中,我们使用数据库并在代码中为Long
- s传递不同内容的ID。
但UserID
不是LogID
而不是ServerID
,尽管它们都是Long
。在我看来,编译器和IDE应该能够检测到整个类别的错误,例如尝试使用UserID
代替ServerID
时。目前编译器没有检测到,因为两者的类型都是Long
。
如果Long
不是final
,我可以说
public class UserID extends Long {};
但Long
是final
,所以我不能。有没有更优雅的东西:
public class UserID {
private Long ID;
UserID(Long ID) {
this.ID = ID;
}
UserID(UserID ID) {
this.ID = ID.toLong();
}
public Long toLong() {
return ID;
}
public void fromLong(Long ID) {
this.ID = ID;
}
};
编辑:我知道这是不优雅的 - “糟糕”!评论似乎假设我将在我的生产代码中添加这样的东西。我不是。
这看起来非常浪费和不优雅。我想祝你好运DbUtils在JavaBean处理中使用UserID
。
是否有“更好的方式”(TM)? (除了住在Long
- s ;-))
答案 0 :(得分:0)
在我们的项目中,我们创建了其他Ids继承的Id
类,如UserId
。拥有单独的Id类有助于提高代码清晰度。
一旦我们遇到一个问题,其中函数接收了两个Id,那就是多头。程序员把这些id放在错误的顺序 - 大问题可能来自这些错误。
我的建议是做同样的事情,不要尝试从Long扩展,而是从你自己的Id类扩展。 :)
答案 1 :(得分:0)
public abstract class Def<T extends Comparable> implements Comparable<Def<T>> {
Comparable value = null;
/**
* Initializes this object. Can only be called once.
*
* Unfortunately, this allows us to return the wrong object type.
*
*/
public <C extends Def> C set(T i) {
if (value == null) {
value = i;
return (C)this;
} else {
throw new IllegalStateException("Can only call set once!");
}
}
@Override
public String toString() {
return value.toString();
}
@Override
public boolean equals(Object o) {
if (o == null) {
return false;
}
Class clz = this.getClass();
Class thatclz = o.getClass();
if (clz == thatclz) {
return ((Def)o).value.equals(this.value);
}
throw new IllegalArgumentException("Bad programmer! Comparing " + clz + " to " + thatclz);
}
@Override
public int hashCode() {
return value.hashCode();
}
public T value() {
return (T)value;
}
@Override
public int compareTo(Def<T> o) {
return this.value.compareTo(o.value);
}
}
随后:
static class UserID extends Def<Long> {}
UserID a = new UserID().set(81811L);
答案 2 :(得分:-2)
使用BigInteger
而不是使用UserID
类型。这样,您就可以BigInteger
扩展[]
。