代码之家  ›  专栏  ›  技术社区  ›  Manish Kumar

调用枚举单例中的参数化构造函数?

  •  0
  • Manish Kumar  · 技术社区  · 6 年前

    我有一个枚举单例类:

    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 通过传递自定义参数?

    0 回复  |  直到 6 年前
        1
  •  2
  •   Alexander Pavlov    6 年前

    你可以吃这样的东西

        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();
    
            }
    
        2
  •  1
  •   Level_Up    6 年前

    通常可以使用类类型,而不是枚举类型。枚举是静态的和最终的。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("-----------------");
            }
    
        }
    
    }
    
        3
  •  0
  •   ikos23    6 年前

    正如您可能知道的-枚举类型的构造函数必须是包私有或私有访问。

    它被自动调用并创建在枚举体开头定义的常量。

    您不能自己调用枚举构造函数。

    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
    }