加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 根据对象属性确定哪个枚举返回

发布时间:2020-12-15 02:19:59 所属栏目:Java 来源:网络整理
导读:我想知道是否有一些设计模式来帮助我解决这个问题. 假设我有一个Person类,它有三个属性:name,nickname和speaksEnglish,以及一个带TypeOne,TypeTwo和TypeThree的Enum PersonType. 假设一个人有昵称并说英语,那么它就是一个TypeOne.如果它有昵称但不会说英语,
我想知道是否有一些设计模式来帮助我解决这个问题.

假设我有一个Person类,它有三个属性:name,nickname和speaksEnglish,以及一个带TypeOne,TypeTwo和TypeThree的Enum PersonType.

假设一个人有昵称并说英语,那么它就是一个TypeOne.如果它有昵称但不会说英语,那就是TypeTwo.如果它没有昵称,那么它就是TypeThree.

我的第一个想法将有一个方法与一些if-else并返回相关的枚举.将来我可以在Person和其他类型的PersonType中有更多属性来决定.

所以,我的第一个想法是用一堆if(…){return< PersonType>创建一个方法.或者switch-case,但我想知道是否有一些我可以使用的设计模式而不是ifs和switch-case.

解决方法

我建议你使用简单的继承与不可变对象.

所以,首先你必须创建抽象类:

public abstract class AbstractPerson {

    private final String name;
    private final Optional<String> nickname; 
    private final boolean speaksEnglish;
    private final PersonType personType;

    protected AbstractPerson(final String name,final Optional<String> nickname,final boolean speaksEnglish,final PersonType personType) {
        this.name = name;
        this.nickname = nickname;
        this.speaksEnglish = speaksEnglish;
        this.personType = personType;
    }

    public String getName() {
        return name;
    }

    public Optional<String> getNickname() {
        return nickname;
    }

    public boolean getSpeaksEnglish() {
        return speaksEnglish;
    }

    public PersonType getPersonType() {
        return personType;
    }

}

使用PersonType枚举:

public enum PersonType {

    TypeOne,TypeTwo,TypeThree;

}

现在,我们在子类中有三个选项和相应的构造函数:

public final class EnglishSpeakingPerson extends AbstractPerson {

    public EnglishSpeakingPerson(final String name,final String nickname) {
        super(name,Optional.of(nickname),true,PersonType.TypeOne);
    }

}

public final class Person extends AbstractPerson {

    public Person(final String name,false,PersonType.TypeTwo);
    }

    public Person(final String name) {
        super(name,Optional.empty(),PersonType.TypeThree);
    }

}

在这种情况下,我们的具体类是不可变的,其类型是在创建时定义的.您不需要创建if-else梯形图 – 如果要创建新类型,只需创建新的类/构造函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读