栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

我可以在Java枚举上使用构建器模式吗

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

我可以在Java枚举上使用构建器模式吗

尽管它并不严格符合构建器模式,但简短的答案是肯定的。有点。

缺少的部分无法调用

.build()
以实例化枚举常量,因为build()不能使用
new
。但是您可以从构建器模式中获得很多好处。面对现实,您不能使用静态工厂方法,并且枚举常量的内联子类化很奇怪。

这是使用国家枚举的示例。

package app;import org.apache.commons.lang.StringUtils;import javax.annotation.Nullable;import java.util.EnumSet;import java.util.Set;import static app.Language.*;import static com.google.common.base.Preconditions.*;enum Language {    ITALIAN,    ENGLISH,    MALTESE}public enum Country {    ITALY(new Builder(1, "Italy").addLanguage(ITALIAN)),    MALTA(new Builder(2, "Malta").addLanguages(MALTESE, ENGLISH, ITALIAN).setPopulation(450_000));    final private int id;    final private String name;    final private Integer population;    final private Set<Language> languages;    private static class Builder {        private int id;        private String name;        private Integer population;        private Set<Language> languages = EnumSet.noneOf(Language.class);        public Builder(int id, String name) { checkArgument(!StringUtils.isBlank(name)); this.id = id; this.name = name;        }        public Builder setPopulation(int population) { checkArgument(population > 0); this.population = population; return this;        }        public Builder addLanguage(Language language) { checkNotNull(language); this.languages.add(language); return this;        }        public Builder addLanguages(Language... language) { checkNotNull(language); this.languages.addAll(languages); return this;        }    }    private Country(Builder builder) {        this.id = builder.id;        this.name = builder.name;        this.population = builder.population;        this.languages = builder.languages;        checkState(!this.languages.isEmpty());    }    public int getId() {        return id;    }    public String getName() {        return name;    }    @Nullable    public Integer getPopulation() {        return population;    }    public Set<Language> getLanguages() {        return languages;    }}

如果您有构建常量的常用方法,甚至可以将静态工厂方法放入构建器中。

因此,它不是Bloch的构建器,但非常接近。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/455657.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号