joshin4colours
joshin4colours

Reputation: 1696

Is it possible to pass arguments into Enum values?

Suppose I have a Enum defined something like this:

public enum Sample{
    // suppose AClass.getValue() returns an int
    A(AClass.getValue()), 
    B(AClass.getValue()),
    C(AClass.getValue());

    private int _value; 

    private Sample(int _val){
        this._value = _val; 
    }

    public int getVal(){
        return _value; 
    }

I can pull out values using Sample.A or Sample.A.getAVal() without issue.

Now suppose that AClass.getValue() could take a parameter to return a possibly different particular value, eg AClass.getValue(42).

It is possible to pass arguments to a public Enum method and retrive the Enum values? In other words, could I have an Enum definition like

    public enum Sample{
        // suppose AClass.getValue() returns an int
        A(AClass.getAValue()), 
        B(AClass.getBValue()),
        C(AClass.getCValue());

        private int _value; 

        private Sample(int _val){
           this._value = _val; 
        }

        public int getVal(){
            return _value; 
        }

        public int getVal(int a){
            // somehow pull out AClass.getAValue(a)
        }

using Sample.A.getValue(42)?

Upvotes: 8

Views: 20380

Answers (3)

sklimkovitch
sklimkovitch

Reputation: 271

public class App {
    public static void main(String[] args) {
        Fruit.setCounter(5);
        System.out.println(Fruit.Apple.getCmd());
        Fruit.setCounter(6);
        System.out.println(Fruit.Apple.getCmd());
    }
}

public enum Fruit {
    Apple {
        public String getCmd() {
            return counter + " apples";
        }
    },
    Banana {
        public String getCmd() {
            return counter + " bananas";
        }
    };

    private static int counter = 0;

    public abstract String getCmd();

    public static void setCounter(int c) {
        counter = c;
    }
}




Output:
5 apples
6 apples

Upvotes: -3

Denys Séguret
Denys Séguret

Reputation: 382150

As stated in Java Specification

there is only one instance of each enum constant

So no, you can't have different values of a specific enum constant.

But you could put an array or a map inside your enum, so Sample.A.getValue(42) would return Sample.A.myMap.get(42) :

public enum Sample{
        A(), 
        B(),
        C();

        Map<Integer, Integer> myMap = new HashMap<Integer, Integer>();


        public int getVal(int i){
            return myMap.get(i); 
        }
        public int setVal(int i, int v){
            return myMap.put(i, v); 
        }
}

Upvotes: 3

Jon Skeet
Jon Skeet

Reputation: 1500595

You can do it, but only by making an abstract method in the enum, and overriding it in each value:

public enum Sample {
    A(AClass.getAValue()) {
        @Override public int getVal(int x) {
            return AClass.getAValue(x);
        }
    },
    B(BClass.getAValue()) {
        @Override public int getVal(int x) {
            return BClass.getBValue(x);
        }
    },
    C(CClass.getAValue()) {
        @Override public int getVal(int x) {
            return CClass.getCValue(x);
        }
    };

    private int _value; 

    private Sample(int _val){
       this._value = _val; 
    }

    public int getVal(){
        return _value; 
    }

    public abstract int getVal(int x);
}

Of course if you could create an instance of some other base type which has a getValue(int x) method, then you could put the code into the enum class itself instead of into the nested ones.

Upvotes: 8

Related Questions