为什么我在这个使用枚举的随机值来构建我的实例的工厂 class 中出现这些错误?

Why I have these error in this factory class that use random values of an enum to build my instance?

我在尝试在 Java 中实现一个工厂 class 时遇到了一些困难,该工厂构建了一个 RoomTipology 对象,从 [=35] 中选择一个随机值=]枚举。所以我有以下情况:

public class RoomTipologyMockFactory {

    private RoomTipology roomTipology;

    private static enum RoomTipologyEnum {
        MATRIMONIALE,
        MATRIMONILAE_SUPERIOR,
        QUADRUPLA,
        TRIPLA,
        SINGOLA;

        private static final List<RoomTipologyEnum> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
        private static final int SIZE = VALUES.size();
        private static final Random RANDOM = new Random();

        public static RoomTipologyEnum getRandomRoomTipologyValue()  {
            return VALUES.get(RANDOM.nextInt(SIZE));
        }
    }

    public static RoomTipology getRandomRoomTipology() {

        List<Object> value = RoomTipologyEnum.getRandomRoomTipology();

        RoomTipology result = new RoomTipology();

        switch (roomTipology) {

            case MATRIMONIALE:
                result.setName("Matrimoniale");
                result.setDescription("Camera matrimoniale con bagno interno, Lorem ipsum dolor sit amet, consectetuer " +
                        "adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus " +
                        "et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, " +
                        "pellentesque eu, pretium quis, sem.");
                result.setMaxPeople(2);
                result.setTimeStamp(new Date());

                break;

            case MATRIMONILAE_SUPERIOR:
                result.setName("Matrimoniale Superior");
                result.setDescription("Camera con bagno dotata di piccolo angolo soggiorno completo di divano e " +
                        "scrivania, molto luminosa, pavimenti in parquet, riscaldamento e aria condizionata, " +
                        "armadio/guardaroba, TV a schermo piatto dotata di canali satellitari, connessione Wi-Fi " +
                        "gratuita, bollitore e selezione di tè e tisane.");
                result.setMaxPeople(2);
                result.setTimeStamp(new Date());

                break;

            case QUADRUPLA:
                result.setName("Camera Quadruola");
                result.setDescription("Camera per quattro persone con bagno interno, Lorem ipsum dolor sit amet, consectetuer " +
                        "adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus " +
                        "et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, " +
                        "pellentesque eu, pretium quis, sem.");
                result.setMaxPeople(4);
                result.setTimeStamp(new Date());

                break;

            case TRIPLA:
                result.setName("Camera Tripla");
                result.setDescription("Camera per tre persone con bagno interno, Lorem ipsum dolor sit amet, consectetuer " +
                        "adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus " +
                        "et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, " +
                        "pellentesque eu, pretium quis, sem.");
                result.setMaxPeople(3);
                result.setTimeStamp(new Date());

                break;

            case SINGOLA:
                result.setName("Camera Singola");
                result.setDescription("Camera singola persona con bagno interno, Lorem ipsum dolor sit amet, consectetuer " +
                        "adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus " +
                        "et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, " +
                        "pellentesque eu, pretium quis, sem.");
                result.setMaxPeople(1);
                result.setTimeStamp(new Date());

                break;
        }

    return result;

    }

}

正如您在前面的代码中看到的,我有一个外部 RoomTipologyMockFactory 用于创建 RoomTipology class.

每次调用 getRandomRoomTipology() 方法时,都必须选择 RoomTipologyEnum 枚举的随机可能值,因此它用它来构建 RoomTipology class.

的特定模拟

因此,在枚举定义中,我创建了 getRandomRoomTipologyValue() 方法,该方法 return 是枚举

中的一个随机值

public static RoomTipologyEnum getRandomRoomTipologyValue() { return VALUES.get(RANDOM.nextInt(SIZE)); }

我必须将此值用于 getRandomRoomTipology 到 return 特定的 RoomTipology 模拟实例。

我有两个问题:

1) 我已将此枚举声明为 private static(因此它是 class 级别,理论上我不必使用 new() 构建它因为我从当前的 RoomTipologyMockFactory 实例中获取它。但是我做不到:

List<Object> value = RoomTipologyEnum.getRandomRoomTipology();

似乎无法解析为 getRandomRoomTipology() 方法。

2) 我没有更多要打开枚举但我认为 returned 值。

怎么了?我错过了什么?我该如何解决这个问题?

public class RoomTipologyMockFactory {

    private enum RoomTipologyEnum {
        MATRIMONIALE,
        MATRIMONILAE_SUPERIOR,
        QUADRUPLA,
        TRIPLA,
        SINGOLA;

        private static final List<RoomTipologyEnum> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
        private static final int SIZE = VALUES.size();
        private static final Random RANDOM = new Random();
        private static List<Object> randomRoomTipology;

        public static RoomTipologyEnum getRandomRoomTipologyValue()  {
            return VALUES.get(RANDOM.nextInt(SIZE));
        }

    }

    public static RoomTipology getRandomRoomTipology() {
        RoomTipologyEnum roomTipologyEnum = RoomTipologyEnum.getRandomRoomTipologyValue();
        RoomTipology result = new RoomTipology();
        switch (roomTipologyEnum) {
            case MATRIMONIALE:
                break;
            case MATRIMONILAE_SUPERIOR:
                break;
            case QUADRUPLA:
                break;
            case TRIPLA:
                break;
            case SINGOLA:
                break;
        }
        return result;
    }

}

正如您在问题 getRandomRoomTipologyValue() 中所写,您在枚举中的功能是 Olayinka 首先陈述的内容。

我还通过为枚举提供一些属性解决了开关问题。 我将第一个属性标签命名为避免与名称-Method of Enum

混淆
public class RoomTipologyMockFactory {

    private RoomTipology roomTipology;

    private static enum RoomTipologyEnum {
        MATRIMONIALE("Matrimoniale","Camera matrimoniale con bagno interno, Lorem ipsum dolor sit amet, consectetuer " +
                "adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus " +
                "et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, " +
                "pellentesque eu, pretium quis, sem.",2),

        MATRIMONILAE_SUPERIOR(...),
        QUADRUPLA(...),
        TRIPLA(...),
        SINGOLA(...);

        private String label;
        private String description;
        private int maxPeople;

        private static final List<RoomTipologyEnum> VALUES = Collections.unmodifiableList(Arrays.asList(values()));
        private static final int SIZE = VALUES.size();
        private static final Random RANDOM = new Random();

        public static RoomTipologyEnum getRandomRoomTipologyValue()  {
            return VALUES.get(RANDOM.nextInt(SIZE));
        }

        private RoomTipologyEnum(String label, String description, int maxPeople) {
            this.label = label;
            this.description = description;
            this.maxPeople = maxPeople;
        }

        public String getLabel() {
            return label;
        }

        public String getDescription() {
            return description;
        }

        public int getMaxPeople() {
            return maxPeople;
        }

    }

    public static RoomTipology getRandomRoomTipology() {

        RoomTipologyEnum value = RoomTipologyEnum.getRandomRoomTipologyValue();

        RoomTipology result = new RoomTipology();

        result.setName(value.getLabel());
        result.setDescription(value.getDescription());
        result.setMaxPeople(value.getMaxPeople());
        result.setTimeStamp(new Date());

    return result;

    }

}