如果您認爲將來可能會擴展接口,從而導致子類不兼容(因爲它們不會實現這些方法),那麼使用該空的抽象超類可能是一種使它能夠輕鬆編譯的方法。
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