我有一些类在子类型层次结构中具有相同的“级别”。我需要为每个实例创建一个ID,我通常通过拥有一个包含静态long的父类来实现,我只是为子类的每个实例递增它。
子类型的75%代码是相同的 - 这使我更喜欢使用抽象类(通过接口):
1)我可以为ID创建者声明一个静态变量
2)我可以将代码放在父类中,并在子类型中共享它
这是对的吗?我似乎很少使用接口。我应该只在子类型需要相同的方法,但不同的实现时,以及当我不需要初始化要在子类型之间共享的属性(如ID创建者)时使用接口吗?
我一直给同事们的印象是接口更适合继承。
答案 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不会工作,所以你现在所拥有的,工作是公平的方法。