Avoid combining get and equals on enum
JavaDemetergetter
Instead of defining a getter for an enum, add one method per enum value checking if the object matches the value.
Advantages
- readability
- hides the enum type
- hides the enum values
- can be used as a predicate
Examples
Example 1:
Positive
Correct implementation following the practice.
package dev.best.practices;
import java.util.List;
public class Zoo {
private final List<Animal> animals;
public Zoo(List<Animal> animals) {
this.animals = animals;
}
public long dogsCount() {
return animals.stream()
.filter(Animal::isDog)
.count();
}
public static class Animal {
private final Species species;
public Animal(Species species) {
this.species = species;
}
public boolean isDog() {
return species == Species.DOG;
}
}
public enum Species {
CAT, DOG
}
}
Negative
Incorrect implementation that violates the practice.
package dev.best.practices;
import java.util.List;
public class Zoo {
private final List<Animal> animals;
public Zoo(List<Animal> animals) {
this.animals = animals;
}
public long dogsCount() {
return animals.stream()
.filter(animal -> animal.getSpecies() == Species.DOG)
.count();
}
public static class Animal {
private final Species species;
public Animal(Species species) {
this.species = species;
}
public Species getSpecies() {
return species;
}
}
public enum Species {
CAT, DOG
}
}