public abstract class Animal {
private LocalDate birthdate;
public Animal(LocalDate birthdate) {
if (birthdate.after(LocalDate.now())) {
throw new IllegalArgumentException("...");
}
this.birthdate = birthdate;
}
public int getAge() {
return Period.between(
birthdate,
LocalDate.now()
).getYears();
}
public String sound();
}
public abstract class Pet extends Animal {
private String name;
public final String getName() { return name; }
public final void setName(String name) {
if (name.isEmpty()) throw new IllegalArgumentException("...");
this.name = name;
}
}
public class Dog extends Pet {
@Override
public String sound() { return "bark"; }
}