public enum Armor {
CLOTHES("clothes"), LEATHER("leather"), CHAIN_MAIL("chain mail"), PLATE_MAIL("plate mail");
private final String title;
Armor(String title) { this.title = title; }
@Override public String toString() { return title; } }
public enum HairColor {
WHITE, BLOND, RED, BROWN, BLACK;
@Override public String toString() { return name().toLowerCase(); }
}
public enum HairType {
BALD("bald"), SHORT("short"), CURLY("curly"), LONG_STRAIGHT("long straight"), LONG_CURLY( "long curly");
private final String title;
HairType(String title) { this.title = title; }
@Override public String toString() { return title; } }
public enum Profession {
WARRIOR, THIEF, MAGE, PRIEST;
@Override public String toString() { return name().toLowerCase(); } }
public enum Weapon {
DAGGER, SWORD, AXE, WARHAMMER, BOW;
@Override public String toString() { return name().toLowerCase(); } }
public final class Hero {
private final Profession profession; private final String name; private final HairType hairType; private final HairColor hairColor; private final Armor armor; private final Weapon weapon;
private Hero(Builder builder) { this.profession = builder.profession; this.name = builder.name; this.hairColor = builder.hairColor; this.hairType = builder.hairType; this.weapon = builder.weapon; this.armor = builder.armor; }
public Profession getProfession() { return profession; }
public String getName() { return name; }
public HairType getHairType() { return hairType; }
public HairColor getHairColor() { return hairColor; }
public Armor getArmor() { return armor; }
public Weapon getWeapon() { return weapon; }
@Override public String toString() {
var sb = new StringBuilder(); sb.append("This is a ") .append(profession) .append(" named ") .append(name); if (hairColor != null || hairType != null) { sb.append(" with "); if (hairColor != null) { sb.append(hairColor).append(' '); } if (hairType != null) { sb.append(hairType).append(' '); } sb.append(hairType != HairType.BALD ? "hair" : "head"); } if (armor != null) { sb.append(" wearing ").append(armor); } if (weapon != null) { sb.append(" and wielding a ").append(weapon); } sb.append('.'); return sb.toString(); }
public static class Builder {
private final Profession profession; private final String name; private HairType hairType; private HairColor hairColor; private Armor armor; private Weapon weapon;
public Builder(Profession profession, String name) { if (profession == null || name == null) { throw new IllegalArgumentException("profession and name can not be null"); } this.profession = profession; this.name = name; }
public Builder withHairType(HairType hairType) { this.hairType = hairType; return this; }
public Builder withHairColor(HairColor hairColor) { this.hairColor = hairColor; return this; }
public Builder withArmor(Armor armor) { this.armor = armor; return this; }
public Builder withWeapon(Weapon weapon) { this.weapon = weapon; return this; }
public Hero build() { return new Hero(this); } } }
public class App {
private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
var mage = new Hero.Builder(Profession.MAGE, "Riobard") .withHairColor(HairColor.BLACK) .withWeapon(Weapon.DAGGER) .build(); LOGGER.info(mage.toString());
var warrior = new Hero.Builder(Profession.WARRIOR, "Amberjill") .withHairColor(HairColor.BLOND) .withHairType(HairType.LONG_CURLY).withArmor(Armor.CHAIN_MAIL).withWeapon(Weapon.SWORD) .build(); LOGGER.info(warrior.toString());
var thief = new Hero.Builder(Profession.THIEF, "Desmond") .withHairType(HairType.BALD) .withWeapon(Weapon.BOW) .build(); LOGGER.info(thief.toString());
} }
|