替代java参数_java – 使用Void作为可选参数的更好的替代方法
我有一個接口指定方法,它采用泛型類型作為輸入,用于創建URL.
interface UrlGenerator {
String prepareUrl( T input );
}
有一個實現不需要參數.它使用Void作為通用類型T.
class StaticUrlGenerator implements UrlGenerator {
private final String url;
public StaticUrlGenerator( String url ) {
this.url = url;
}
@Override
public String prepareUrl( Void nothing ) {
return url;
}
}
StaticUrlGenerator很難使用,因為它需要null作為prepareUrl方法的參數.
我可能會丟失輸入參數:
interface UrlGenerator {
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;
}
}
我認為我的設計肯定存在根本性的錯誤.
解決方法:
I think there must be something fundamentally wrong with my design.
唯一不對的是你試圖混合一個參數方法和一個零參數方法.你不能用Java做到這一點……沒有打開其他問題的大門.
基本上你有三個選擇:
>堅持使用當前的方法,并在Void案例中明確傳遞null.
>在接口中添加第二個(無參數)方法來處理Void案例,并使用null調用一個參數方法.當T不是Void時,你的代碼需要處理null,但無論如何它都做了.
>重構接口,以便有兩個不同的接口,一個使用String prepareUrl(),另一個使用String prepareUrl(T),并將前者作為特殊情況類實現.
就個人而言,選項2略好于選項1,但第3選項可能會導致其他問題;例如具有兩個變體的特定方法將阻礙T類型的整個空間上的多態方法調用.
(Varargs是一個壞主意,因為這為多個爭論打開了大門,這對你的問題可能毫無意義.)
標簽:java,oop,generics
來源: https://codeday.me/bug/20190725/1537588.html
總結
以上是生活随笔為你收集整理的替代java参数_java – 使用Void作为可选参数的更好的替代方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java神剑30变_改动对比 - 神剑养
- 下一篇: java通过按钮打开新窗口_如何在jav