Назовите параметризованный конструктор в enum singleton? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть этот синглтон-класс enum:

enum C1 {
    INSTANCE("");

    C1(String s) {
        System.out.println("with param = " +s);
    }
    C1() {
        System.out.println("without param");
    }   
    public void g() {
        System.out.println("inside g");
    }
}

public class Main {
    public static void main(String s[]) {
        C1.INSTANCE.g();
        C1.INSTANCE.g();

    }
}

Как я могу вызвать конструктор C1(String s), используя INSTANCE, передав пользовательский параметр?

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Как правило, вы можете использовать тип класса, а не тип enum.Перечисления должны быть статичными и окончательными.Идея конструктора enum заключается в том, чтобы инкапсулировать несколько значений, чтобы их можно было использовать после установки только одного типа enum.

public enum Vehicle {
    CAR(4, 2),
    TRUCK(6, 20);

    private Integer numOfTyres;
    private Integer maxWeight;

    Vehicle(Integer numOfTyres, Integer maxWeight) {
        this.numOfTyres = numOfTyres;
        this.maxWeight = maxWeight;
        System.out.println("Number of Tyres = " + numOfTyres);
        System.out.println("Max weight = " + maxWeight);
    }


    public Integer getMaxWeight() {
         return maxWeight;
    }

    public Integer getNumberOfTyres() {
        return numOfTyres;
    }

}


public class Main {
    public static void main(String s[]) {
        Vehicle.CAR.getNumberOfTyres();

        for (Vehicle v : Vehicle.values()) {
            System.out.println();

            StringBuilder sb = new StringBuilder();
            sb.append("Vehicle ");
            sb.append(v.name());
            sb.append(" has ");
            sb.append(v.getNumberOfTyres());
            sb.append(" number of tyres and ");
            sb.append(v.getMaxWeight());
            sb.append(" max weight ");


            System.out.println("-----------------");
            System.out.println(sb.toString());
            System.out.println("-----------------");
        }

    }

}
0 голосов
/ 04 марта 2019

Как вы, вероятно, знаете, конструктор для типа enum должен быть закрытым или закрытым доступом.

Он вызывается автоматически и создает константы, которые определены в начале тела enum.

Вы не можете вызвать конструктор enum самостоятельно.

Вот несколько примеров, которые могут оказаться полезными.

public enum MySingleton {
    // if you have multiple constants here - it's not Singleton
    INSTANCE;

    // if you need to provide some info to your INSTANCE,
    // you can add params to its methods
    public void someMethod(String value) {
        System.out.println("inside someMethod, value is " +value);
    }
}

Если вам нужно, чтобы экземпляр имел какое-либо состояние, вы можете добавить поля и конструктор:

public enum MySingleton {
    INSTANCE("Hello");

    private String message;

    MySingleton(String msg) {
        this.message = msg;
    }

    // you can even have getter/setter for it
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Пример основного метода:

public static void main(String[] args) {
    System.out.println(MySingleton.INSTANCE.getMessage()); // prints Hello

    MySingleton.INSTANCE.setMessage("Bye");

    System.out.println(MySingleton .INSTANCE.getMessage()); // prints Bye
}
0 голосов
/ 04 марта 2019

У вас может быть что-то подобное

    enum C1 {
        WITH_PARAM("value"),
        EMPTY();

        private String value;
        C1(String s) {
            System.out.println("with param = " +s);
            value=s;
        }
        C1() {
            System.out.println("without param");
        }
        public void g() {
            System.out.println("inside g, value is "+value);
        }
    }

        public static void main(String s[]) {
            C1.EMPTY.g();
            C1.WITH_PARAM.g();

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...