好的,我摆弄了一个通用标记器(“UserPlaceTokenizer”)但放弃了:问题是工厂需要一个具体类的标记器,所以首先我尝试制作一个通用标记器:
public static class Tokenizer<T extends UserPlace> implements PlaceTokenizer<T> {
@Override
public final T getPlace(final String token) {
return (T) new UserPlace(token); //BAD
}
@Override
public final String getToken(final T place) {
return place.getToken();
}
}
问题是将 UserPlace 转换为 (T) - 这不起作用(UserPlace 不能转换为具体的子类)。所以我需要一个“return new ShowUserPlace(...)”来获取这个实例,以满足 tokenizer 接口。长话短说:我回到了我以前的解决方案:扩展类正在复制超类的构造函数并提供单独的标记器,它们只需调用它们自己的构造函数(调用超级构造函数):
public class ShowUserPlace extends UserPlace {
public ShowUserPlace(String token) {
super(token);
}
@Prefix(value = "showUser")
public static class Tokenizer implements PlaceTokenizer<ShowUserPlace> {
@Override
public final ShowUserPlace getPlace(final String token) {
return new ShowUserPlace(token);
}
@Override
public final String getToken(final ShowUserPlace place) {
return place.getToken();
}
}
}
一个临时解决方案是提供接口方法的抽象标记器。getPlace 将调用一个抽象方法(返回 T),具体实现将调用具体构造函数(也只调用超级构造函数)。最后,此解决方案将具有与上述解决方案大致相同的行数和复制代码:-|。
我对此仍然有一种不好的感觉-可能他们仍然是“..WithFactory”的解决方案,或者是面对这种用例的完全不同的方式。