首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用构造函数体定义的本地类有问题吗?

用构造函数体定义的本地类有问题吗?
EN

Stack Overflow用户
提问于 2015-08-10 13:43:02
回答 2查看 61关注 0票数 0

我有以下内容:

代码语言:javascript
复制
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的构造函数。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-11 05:03:26

您的方法很好,但是在Java8中,您可以使用方法引用或lambda(并用更标准的Supplier替换Creator )使其更好:

代码语言:javascript
复制
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":

代码语言:javascript
复制
creators.put(FilterType.DATE, () -> new DynamicDTO());
...

这两个变体(方法引用与lamdbas)基本上是等价的,您应该使用更清晰的(引文:Java语言架构师本人)。我个人认为方法引用在视觉上更清晰,尽管它确实需要一些习惯。

票数 1
EN

Stack Overflow用户

发布于 2015-08-10 13:55:39

我看到的唯一问题是,您正在为FilterFactory的每个实例创建一个新的FilterFactory实例(这需要更多的内存)。您可以通过创建一些常量来防止这种情况:

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31921178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档