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

use*_*112 0 java oop inheritance interface

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

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

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

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

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

我一直给同事们的印象是Interfaces比继承更受欢迎.

Mar*_*nik 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();
  }
}
Run Code Online (Sandbox Code Playgroud)