![](/img/trans.png)
[英]Why does Java allow only a single method X when implementing 2 interfaces that both declare X but which differ in their throws clauses?
[英]Which design pattern is recommended when implementations only differ in a single method?
我有一個界面,有6種方法用於管理數據集。 實現之間唯一不同的方法是getSerializedVersion()
和能夠解析序列化字符串的構造函數。
public interface DataSets {
public void addEntry(...);
public void removeEntry(...);
public void manipulateEntry(...);
public SomeType getEntry(...);
public List<SomeType> getAllEntries();
// This differs:
public String getSerializedVersion()
}
我無法改變界面。
我的第一個想法是生成一個抽象類並實現前五個方法。 對於具體實現(例如DataSetsXML
, DataSetsYAML
,...),我只需要實現getSerializedVersion()
以及能夠讀取String並初始化對象的構造函數。
為了使它更易於測試,不同的設計可能會更好( https://stackoverflow.com/a/7569581 ),但哪一個?
答案可能是主觀的,但我認為有一些一般規則或不同方法的最小(客觀)優點和缺點,......
從你解釋的是,差異是與類的行為無關的東西,而是它是如何序列化和反序列化的。 我的意思是DataSetsXML
和DataSetsYAML
將具有相同的相同功能,但它們將被序列化為不同的格式。
這意味着保持getSerializedVersion()
與DataSets
類相結合沒有任何好處。 你應該完全解耦他們。
您可以使用序列化接口:
interface DataSetsSerializer
{
public DataSets unserialize(String string);
public String serialize(DataSets sets);
}
然后在這個類中處理不同的實現,例如:
class YAMLDataSetsSerializer implements DataSetsSerializer
{
public DataSets unserialize(String string) {
DataSets sets = new DataSets();
...
}
public String serialize(DataSets sets) {
...
}
}
通過詳細闡述JB Nizet注釋,如果你必須在DataSets
實例中保留一個DataSetsSerializer
(由於它們應該在任何情況下解耦,因此IMHO沒有意義,因為序列化的特定方式不應該綁定到要序列化的數據)然后方法如下:
class DataSets {
final private DataSetsSerializer serializer;
public DataSets(DataSetsSerializer serializer, String data) {
this.serializer = serializer;
serializer.unserialize(this, data);
}
@Override
public String getSerializedVersion() {
return serializer.serialize(this);
}
}
這需要對建議的界面稍作改動,這不是一個聰明的設計,但它尊重您的要求。
我認為使用抽象類是合理的。 您可以測試抽象類的具體實現(它也間接測試抽象類)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.