共享属性时的抽象类vs接口

时间:2012-07-07 12:19:23

标签: java oop inheritance interface

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

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

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

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

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

我一直给同事们的印象是接口更适合继承。

2 个答案:

答案 0 :(得分: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();
  }
}

答案 1 :(得分:3)

Interfaces and abstract class 用于不同目的。接口通常用于指定合同,接口的用户通过该接口查看如何使用它,而抽象类可以是接口的部分实现

继续讨论属性共享的问题,在接口中声明的变量是静态,更重要的是最终,因为你需要一个你希望它增加的ID,所以这个id不会工作,所以你现在所拥有的,工作是公平的方法。