0

我有一些在子类型层次结构中具有相同“级别”的类。我需要为每个实例创建一个 ID,我通常通过拥有一个包含静态 long 的父类来做到这一点,我只是为子类的每个实例递增它。

75% 的子类型代码是相同的——这让我更喜欢使用抽象类(通过接口):

1) 我可以为 ID 创建者声明一个静态变量

2)我可以将代码放在父类中并在子类型中共享

这个对吗?我似乎很少使用接口。当子类型需要相同的方法但不同的实现时,以及当我不需要初始化要在子类型之间共享的属性(如 ID 创建者)时,我是否应该只使用接口?

同事们一直给我的印象是接口比继承更受欢迎。

4

2 回答 2

5

如果您有不止一组需要生成 ID 的类,那么我不建议使用继承,因为它会限制重用。在那种情况下,为什么不构建一个单独的抽象来提供唯一 ID 生成服务呢?你会给它一个密钥,它会给你一个在所有使用相同密钥的调用中唯一的 ID。

public class IdGenerator 
{
  private IdGenerator() {} // no instantiation or subclassing
  private static final ConcurrentMap<String, AtomicLong> ids =
    new ConcurrentHashMap<String, AtomicLong>();

  public static long id(String key) {
    AtomicLong al = ids.get(key);
    if (al == null) {
      final AtomicLong newL = new AtomicLong(0);
      al = ids.putIfAbsent(key, newL);
      if (al == null) al = newL;
    }
    return al.getAndIncrement();
  }
}
于 2012-07-07T12:25:10.350 回答
3

接口和抽象类 有不同的用途。接口通常用于指定接口的用户看到如何使用它的契约,而抽象类可能是接口的部分实现

谈到你的属性共享问题,接口中声明的变量是静态的,更重要的是最终的,因为你需要一个你希望它递增的 ID,拥有该 ID 将不起作用,所以你现在拥有的和工作是公平的做法。

于 2012-07-07T12:33:59.087 回答