如果您认为将来可能会扩展接口,从而导致子类不兼容(因为它们不会实现这些方法),那么使用该空的抽象超类可能是一种使它能够轻松编译的方法。
I.e.今天你
public interface Foo{
public List<Baz> getBazList();
public String getId();
public String getName();
}
public abstract class AbstractFoo implements Foo{
}
public class Foo1 extends AbstractFoo {
public List<Baz> getBazList() { ... }
public String getId() { ... }
public String getName() { ... }
}
public class Foo2 extends AbstractFoo {
public List<Baz> getBazList() { ... }
public String getId() { ... }
public String getName() { ... }
}
在未来,有人改变(无论何种原因)的界面,让您做到以下几点:
// extended
public interface Foo{
public List<Baz> getBazList();
public String getId();
public String getName();
public void breakMyCode();
}
// provide dummy implementation for breakMyCode()
public abstract class AbstractFoo implements Foo{
public void breakMyCode() {
throw new RuntimeException("not implemented");
}
}
// unchanged
public class Foo1 extends AbstractFoo {
public List<Baz> getBazList() { ... }
public String getId() { ... }
public String getName() { ... }
}
// unchanged
public class Foo2 extends AbstractFoo {
public List<Baz> getBazList() { ... }
public String getId() { ... }
public String getName() { ... }
}
这是一个好主意?不是真的。当接口得到扩展时,可能有一个原因,只是提供一个虚拟实现,或者什么也不做,或者抛出一个RuntimeException不会使程序按预期工作。这是一种在编译期间隐藏忽略的方式,但让它们在运行时破坏程序。
我不会有没有方法的抽象类。它什么也没加。这与布洛赫的建议相反。界面就够了。 – duffymo
编号抽象类应为所有孩子提供*共同行为*。如果没有什么可与孩子分享的话,就不应该有这样的超级班。 –
对于那些低估了这个问题的人,你能说出为什么downvote? – user1422163