Skip to main content

Avoid combining get and equals on enum

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