我有以下内容:
enum FilterFactory {
INSTANCE;
private final Map<FilterType, Creator> creators;
private FilterFactory() {
creators = new HashMap<>();
class SimplCreator implements FilterCreator{
@Override
public FilterDTO createDto() {
return new FilterDTO();
}
} //Local class within the constructor
creators.put(FilterType.DATE, new FilterCreator(){
@Override
public FilterDTO createDto() {
return new DynamicDTO();
}
});
creators.put(FilterType.DROP_DOWN_LIST, new SimplCreator());
creators.put(FilterType.FIELD, new SimplCreator());
}
private static interface Creator{
public FilterDTO createDto();
}
//Other staff
}问题是,我从未在构造函数体中使用过本地类。它能引起一些错误吗,这样做不好吗?此外,构造函数enu的构造函数。
发布于 2015-08-11 05:03:26
您的方法很好,但是在Java8中,您可以使用方法引用或lambda(并用更标准的Supplier替换Creator )使其更好:
import java.util.function.Supplier;
enum FilterFactory {
INSTANCE;
private final Map<FilterType, Supplier<FilterDTO>> creators;
private FilterFactory() {
creators = new EnumMap<>(FilterType.class); // a bit more efficient :)
creators.put(FilterType.DATE, DynamicDTO::new);
creators.put(FilterType.DROP_DOWN_LIST, SimpleDTO::new);
creators.put(FilterType.FIELD, SimpleDTO::new);
}
// other stuff ...
}在这里,我使用构造函数的方法参考来实例化Supplier<FilterDTO>。我本可以用一个lambda表达式来表示“不给任何东西,给我一个FilterDTO":
creators.put(FilterType.DATE, () -> new DynamicDTO());
...这两个变体(方法引用与lamdbas)基本上是等价的,您应该使用更清晰的(引文:Java语言架构师本人)。我个人认为方法引用在视觉上更清晰,尽管它确实需要一些习惯。
发布于 2015-08-10 13:55:39
我看到的唯一问题是,您正在为FilterFactory的每个实例创建一个新的FilterFactory实例(这需要更多的内存)。您可以通过创建一些常量来防止这种情况:
enum FilterFactory {
INSTANCE;
private final Map<FilterType, Creator> creators = new HashMap<>();
private static final SimplCreator DEFAULT_CREATOR = new Creator() {
@Override
public FilterDTO createDto() {
return new FilterDTO();
}
}
private static final FilterCreator DYNAMIC_CREATOR = new Creator(){
@Override
public FilterDTO createDto() {
return new DynamicDTO();
}
}
private FilterFactory() {
creators.put(FilterType.DATE, DYNAMIC_CREATOR);
creators.put(FilterType.DROP_DOWN_LIST, DEFAULT_CREATOR);
creators.put(FilterType.FIELD, DEFAULT_CREATOR);
}
private static interface Creator{
FilterDTO createDto();
}
//Other stuff
}https://stackoverflow.com/questions/31921178
复制相似问题