public interface GiveAVoice {
void giveAVoice();
}
public abstract class Animal implements GiveAVoice {
private final String name;
private final Integer age;
public Animal(final String name, final Integer age) {
validateAnimalAge(age);
this.name = name;
this.age = age;
}
private void validateAnimalAge(final int age) {
if (age < 0) {
throw new InvalidAnimalAgeException();
}
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
}
public class Cat extends Animal {
private final Umaszczenie umaszczenie;
public Cat(final String name, final Integer age, final Umaszczenie umaszczenie) {
super(name, age);
this.umaszczenie = umaszczenie;
}
@Override
public void giveAVoice() {
System.out.println("Meow");
}
public Umaszczenie getUmaszczenie() {
return umaszczenie;
}
}
public class Dog extends Animal {
private final Breed breed;
public Dog(final String name, final Integer age, final Breed breed) {
super(name, age);
this.breed = breed;
}
@Override
public void giveAVoice() {
System.out.println("Bark Bark!");
}
}
public class Fox extends Animal {
private final Color color;
public Fox(final String name, final Integer age, final Color color) {
super(name, age);
this.color = color;
}
@Override
public void giveAVoice() {
System.out.println("What does the fox say?");
}
public Color getColor() {
return color;
}
}
public static void main(String[] args) {
Dog dog = new Dog("Burek", 1, Breed.MONGREL);
Fox fox = new Fox("Lisek Chytrusek", 2, Color.GINGER);
Cat cat = new Cat("Filemon", 3, Umaszczenie.W_KROPKI);
List<Animal> animalList = List.of(dog, fox, cat);
Animal staryDziad = animalList.stream()
.max(Comparator.comparing(Animal::getAge))
.orElseThrow(NoSuchElementException::new);
System.out.printf("Stary dziad to %s i ma %d lat", staryDziad.getName(), staryDziad.getAge());
}