Создал 3 класса унаследованных от одного и неправильная обработка имени

Создал 3 класса животных, унаследовавших метод от одного, но при обработке неверного имени кот выводит в своей строке (incorrect input), а Собака и Тигр выводит в строке Кота:

HomeCat homeCat = new HomeCat(50, 0);
Dog dog = new Dog(40, 450);
Tiger tiger = new Tiger(50, 50);
tiger.setName("Tiger");
homeCat.setName("Cat");
dog.setName("Dog");

System.out.println(homeCat.getName() + homeCat.run(30) + homeCat.swim(-4));
System.out.println(dog.getName() + dog.run(30) + dog.swim(40));
System.out.println(tiger.getName() + tiger.run(45) + tiger.swim(60));
public class Tiger extends Animal {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        if (name == null | name.length() <= 0) {
            System.out.print("Incorrect name");
        }
        this.name = name;
    }
}

Ответы (1 шт):

Автор решения: Дмитрий

Ваш код в таком виде не имеет никакого смысла и точно не годится как учебный. Ваши классы, наследуемые от Animal, ничего полезного не делают, они просто дублируют код. От такого наследования пользы никакой нет. Вы только усложняете свой код. Здесь нет ООП, потому как здесь нет полиморфизма, ведь здесь нет переопределенных методов (одного наследования для ООП мало). Вся написанная вами логика легко вмещается в один класс. При этом все становится несоизимеримо проще. Я уже молчу про некорректную реализацию сеттера для имени, где вы получите nullpointerexception в случае, если имя будет равно null раньше что успеете что-то проверить, про бессмысленные protected переменные и ничем не отличающиеся друг от друга классы-наследники (кроме названия класса).

public class MainApp {

    public static void main(String[] args) {

        Animal cat = new Animal("Cat", 50, 0);
        Animal dog = new Animal("Dog", 40, 450);
        Animal tiger = new Animal("Tiger", 50, 50);

        System.out.println(cat.getName() + cat.run(30) + cat.swim(-4));
        System.out.println(dog.getName() + dog.run(30) + dog.swim(40));
        System.out.println(tiger.getName() + tiger.run(45) + tiger.swim(60));
    }
}


public class Animal {
    
    private final String name;
    private final int run ;
    private int swim ;

    public Animal(String name, int run, int swim) {
        if (name == null || name.isEmpty()) throw new RuntimeException("Incorrect name");
        this.name = name;
        this.run = run;
        this.swim = swim;
    }

    public String getName() {
        return name;
    }
    
    public String run(int block) {
        if (block >= run) return " Не пробежал и ";
        if (block <= run && block > 0) return " Пробежал и ";
        return " Он даже не пытался и ";
    }

    public String swim(int dontSwim) {
        if (dontSwim >= swim) return "Не проплыл";
        if (dontSwim <= swim && dontSwim > 0) return "Проплыл";
        return "Утонул";
    }
    
}
→ Ссылка