如何“公共级FoobarID延伸长”?

时间:2015-10-10 19:49:10

标签: java

我想我必须接受Longfinal并且无法延期。

在我们的项目中,我们使用数据库并在代码中为Long - s传递不同内容的ID。

UserID不是LogID而不是ServerID,尽管它们都是Long。在我看来,编译器和IDE应该能够检测到整个类别的错误,例如尝试使用UserID代替ServerID时。目前编译器没有检测到,因为两者的类型都是Long

如果Long不是final,我可以说

public class UserID extends Long {};

Longfinal,所以我不能。有没有更优雅的东西:

    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 ;-))

之外

3 个答案:

答案 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扩展[]