Когда использовать наследование, а когда перечисление?

> В случае создания кораблей разного типа какой подход лучше ? Создать абстрактный класс корабль и он него наследовать разные типы кораблей, либо же создать enum класс с типами кораблей?

enum выглядит лаконичней и по смыслу ближе, ведь у нас корабли не отличаются по функциональности друг от друга? Значит нам нечего переопределять для них, как потомков, кроме длины

Поэтому используем enum, вроде такого:

public enum ShipType {
    ONE("Однопалубный", 1),
    TWO("Двухпалубный", 2),
    THREE("Трехпалубный", 3),
    FOUR("Четырехпалубный", 4);
    private String shipName;
    private int numOfDecks;
    ShipType(String shipName, int numOfDecks) {
        this.shipName = shipName;
        this.numOfDecks = numOfDecks;
    }
    public String getShipName() {
        return shipName;
    }
    public int getNumOfDecks() {
        return numOfDecks;
    }
}

ОК! ИДЕМ ДАЛЬШЕ!