java - 强制对象字段仅具有从父类继承的某些值

标签 java enums field limit

我有抽象类Pet和抽象方法feed(...)。该方法必须仅适用于某些三种类型的食物(干、湿或生)。这些可以是 String 类型,因为我仅在后面的逻辑中将它们用作 SWITCH 中的指示符。我还有两个子类 CatDog。他们实现了 Pet 的 feed(...) 方法。我最接近的是使用 ENUM: Pet.java:

public abstract class Pet {

    public enum FoodType {
        DRY,
        WET,
        RAW;
    }

    public abstract void feed(FoodType foodType);
}

Cat.java:

public class Cat extends Pet {

    public void feed(FoodType foodType) {
        switch (foodType) {
            case DRY:
                System.out.println("Feeding this cat dry food.");
                break;
            case RAW:
                System.out.println("Feeding this cat raw food.");
                break;
            case WET:
                System.out.println("Feeding this cat wet food.");
                break;
        }
    }
}

Dog.java:

public class Dog extends Pet {

    public void feed(FoodType foodType) {
        // implementation similar to feed() in Cat.
    }
}

应用程序.java:

import pets.Dog;
import pets.Pet;

public class App {

    public static void main(String[] args) {
        Dog dog01 = new Dog();
        dog01.feed(Pet.FoodType.DRY);
    }
}

但我不喜欢这样,因为默认情况下 ENUMS 是静态的 FoodType 可以从项目中的任何位置访问。无需创建 CatDog 对象,我就可以从任何地方调用 Pet.FoodType.DRY 。最好它应该只与继承自 Pet 的对象关联,例如:

Dog dog01 = new Dog();
dog01.FoodType.DRY; // do smth with this

最佳答案

发生这种情况是因为您已将 FoodType 声明为公共(public)。请将其替换为 protected,此问题将得到解决。

protected enum FoodType

为了解决这个问题,我们可能可以将其实现为业务逻辑

public abstract class Pet {

    protected String[] foodType = new String[]{"RAW","DRY","WET"};

    protected final String RAW_FOOD_TYPE = "RAW";
    protected final String DRY_FOOD_TYPE = "DRY";
    protected final String WET_FOOD_TYPE = "WET";

    public abstract void feed(String foodType);

    public String getRawFoodType()
    {
        return RAW_FOOD_TYPE;
    }

    public String getDryFoodType()
    {
        return DRY_FOOD_TYPE;
    }

    public String getWetFoodType()
    {
        return WET_FOOD_TYPE;
    }

}


public class Cat extends Pet {

    public void feed(String foodType) 
    {
        if(foodType.equals(DRY_FOOD_TYPE))
        {
            System.out.println("Feeding this cat dry food.");
        }
        else if(foodType.equals(RAW_FOOD_TYPE))
        {
            System.out.println("Feeding this cat raw food.");
        }
        else if(foodType.equals(WET_FOOD_TYPE))
        {
            System.out.println("Feeding this cat wet food.");
        }
        else
        {
            throw new RuntimeException("Invalid foodtype");
        }

    }
}


public class App {

    public static void main(String[] args) {
        Cat cat01 = new Cat();
        cat01.feed(cat01.getDryFoodType());

    }
}

```

关于java - 强制对象字段仅具有从父类继承的某些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61017072/

相关文章:

java - Tomcat 6 上的共享服务?

java - 为什么 EnumSet 实现为抽象类而 EnumMap 实现为具体类?

elasticsearch - Elasticsearch:对_all查询有效,但对特定字段不查询

java - 如何从Java中的其他类读取私有(private)字段的值?

java - @Configuration 类的 bean 是否始终为 null?

java - DatagramPacket 和 DatagramSocket 发送的字符串不等于其本身的文字表示

java - Swing:如何延迟从菜单栏/子菜单打开菜单

python - 如何让 Enum 的成员进入全局命名空间?

java - 如何强制 Checkstyle 中的枚举常量必须为大写?

field - sitecore 如果 FieldRenderer 没有值,不显示它