Java – determines which enumeration returns based on object properties

I wonder if there are any design patterns to help me solve this problem

Suppose I have a person class, which has three properties: name, nickname and speaksenglish, and an enum person type with typeone, typetwo and typethree

If a person has a nickname and speaks English, it is a typeone If it has a nickname but can't speak English, it's type two If it has no nickname, it is typethree

My first idea would be to have a method with some if else and return the associated enumeration In the future, I can have more attributes in person and other types of person types

So, my first idea is to create a method. Or switch case with a bunch of if (...) {return < persontype >, but I want to know if there are some design patterns I can use instead of IFS and switch case

Solution

I suggest you use simple inheritance and immutable objects

Therefore, first you must create an abstract class:

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;
    }

}

Use the persontype enumeration:

public enum PersonType {

    TypeOne,TypeTwo,TypeThree;

}

Now, we have three options and corresponding constructors in the subclass:

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);
    }

}

In this case, our concrete class is immutable, and its type is defined at creation time You don't need to create an if else ladder – if you want to create a new type, just create a new class / constructor

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>