Ich denke, dass beim Erstellen eines Objekts der Code aktualisiert werden kann, wenn Sie enum anstelle der bedingten Verzweigung mit if-Anweisung oder switch-Anweisung verwenden.
Das Folgende ist ein Implementierungsbeispiel für Enum, das das entsprechende Tier zurückgibt, wenn eine Rinde eingegeben wird.
AnimalCreator.java
public enum AnimalCreator {
CAT("nyaa", Cat::new),
DOG("waon", Dog::new),
BIRD("pii", Bird::new);
private String nakigoe;
private Supplier<Animal> create;
AnimalCreator(String nakigoe, Supplier<Animal> creator) {
this.nakigoe = nakigoe;
this.create = creator;
}
//Karte, die Tier von der Rinde umkehrt
private static final Map<String, AnimalCreator> map =
Stream.of(AnimalCreator.values())
.collect(Collectors.toMap(a -> a.nakigoe, a -> a));
//factory method
public static Animal of(String nakigoe) {
return Optional.ofNullable(map.get(nakigoe))
.map(a -> a.create.get())
.orElseThrow(IllegalArgumentException::new);
}
}
Der Anrufer sieht so aus. Es gibt keine bedingte Verzweigung, daher ist der Code sauberer.
main.java
Animal cat = AnimalCreator.of("nyaa");
Animal dog = AnimalCreator.of("waon");
Animal bird = AnimalCreator.of("pii");
Animal mouse = AnimalCreator.of("chu");
// java.lang.IllegalArgumentException tritt auf
Recommended Posts