我有一个接口指定方法,该方法将泛型类型作为输入,用于创建 URL。
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;
}
}
我认为我的设计一定存在根本性的问题。