我有一個接口指定方法,它將一個通用類型用作輸入,用於創建一個URL。使用Void作爲可選參數的更好選擇
interface UrlGenerator<T> {
String prepareUrl(T input);
}
有一種實現不需要參數。它使用void對於普通類型T.
class StaticUrlGenerator implements UrlGenerator<Void> {
private final String url;
public StaticUrlGenerator(String url) {
this.url = url;
}
@Override
public String prepareUrl(Void nothing) {
return url;
}
}
的StaticUrlGenerator是難以使用,因爲它需要null作爲參數傳遞給prepareUrl
方法。
我可能會失去了input
參數:
interface UrlGenerator<T> {
String prepareUrl(T input);
}
現在我必須要通過所需的輸入到其它的方式實現類(在構造函數)。這樣我就失去了類的無狀態性,每次我想改變輸入時,我都必須用不同的構造函數參數重新創建它。
class SchedulePageUrlGenerator implements UrlGenerator {
public static final String QUERY_STRING_BASE = "?from=";
private final String showingBaseUrl;
private final LocalDate date;
public SchedulePageUrlGenerator(String showingBaseUrl, LocalDate date) {
this.showingBaseUrl = showingBaseUrl;
this.date = date;
}
@Override
public String prepareUrl() {
DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyy-MM-dd");
String dateStr = fmt.print(date);
return showingBaseUrl + QUERY_STRING_BASE + dateStr;
}
}
我認爲我的設計一定會有一些根本性的錯誤。
你可以使用一個可變參數的簽名從一開始:'字符串prepareUrl(T. ..輸入);' –
對我來說看起來像一個Twitter API客戶端:-)無論如何...在面向對象,操作不是由他們的名字來定義,而是由他們做什麼。在你的場景中,prepareUrl在不同的類中做不同的事情。解決方法是給兩個方法使用不同的名稱來區分它們的操作。 – 2012-08-29 13:34:27