Ninja Coding
Ninja Coding

Reputation: 1404

How can i get the name of a property by its value?

I have a class:

public class Something{
    public static final int SOMETHING_0 = 0;
    public static final int SOMETHING_1 = 1;
    public static final int SOMETHING_2 = 2;
    // ... etc
}

values are unique, How can i get the name of a property by its value?

via reflection, for example:

// intValue = 1
String getNameByValue(int intValue){
    ...
    // returns "SOMETHING_1"
    return nameOfProperty;
} 

Upvotes: 0

Views: 182

Answers (2)

Andreas
Andreas

Reputation: 159225

One option is this:

public class Something {
    public static final int SOMETHING_0 = 0;
    public static final int SOMETHING_1 = 1;
    public static final int SOMETHING_2 = 2;
    public String toString(int value) {
        switch (value) {
            case SOMETHING_0: return "SOMETHING_0";
            case SOMETHING_1: return "SOMETHING_1";
            case SOMETHING_2: return "SOMETHING_2";
        }
        throw new IllegalArgumentException("Unknown value: " + value);
    }
}
// Use:
int value = Something.SOMETHING_1;
String name = Something.toString(value);

If int values are consecutive, starting at 0, then you can use an enum and it's ordinal() position:

public enum Something {
    SOMETHING_0, SOMETHING_1, SOMETHING_2
}
// Use:
int value = Something.SOMETHING_1.ordinal();
String name = Something.values()[value].name(); // or toString()

If int values are not consecutive, you can still use enum:

enum Something {
    SOMETHING_0(0),
    SOMETHING_10(10),
    SOMETHING_20(20);
    private final int value;
    private Something(int value) {
        this.value = value;
    }
    public int getValue() {
        return this.value;
    }
    public static Something from(int value) {
        for (Something something : values())
            if (something.value == value)
                return something;
        throw new IllegalArgumentException("Unknown value: " + value);
    }
}
// Use:
int value = Something.SOMETHING_10.getValue();
String name = Something.from(value).name(); // or toString()

Alternatively, if you want display text to be different from constant name, and you don't like exceptions, you can do this:

enum Something {
    SOMETHING_0 ( 0, "Something 0"),
    SOMETHING_10(10, "Something 10"),
    SOMETHING_20(20, "Something 20");
    private final int    value;
    private final String description;
    private Something(int value, String description) {
        this.value = value;
        this.description = description;
    }
    public int getValue() {
        return this.value;
    }
    public String getDescription() {
        return this.description;
    }
    public static Optional<Something> from(int value) {
        for (Something something : values())
            if (something.value == value)
                return Optional.of(something);
        return Optional.empty();
    }
    public static String toString(int value) {
        for (Something something : values())
            if (something.value == value)
                return something.description;
        return "Unknown value (" + value + ")";
    }
}
// Use:
String desc = Something.toString(value);
// Or:
String desc = Something.from(value).map(Something::getDescription).orElse("Oops");

Upvotes: 1

user902383
user902383

Reputation: 8640

you could do this in hard way:

 public class Something {
        public static final int SOMETHING_0 = 0;
        public static final int SOMETHING_1 = 1;
        public static final int SOMETHING_2 = 2;

    }

 String getNameByValue(int intValue) throws IllegalArgumentException,
        IllegalAccessException {
    for (Field field : Something.class.getFields()) {
        if (field.getInt(null) == intValue) {
            return field.getName();
        }
    }
    return "";
}

and if you do this, Santa will go postal and slaughter dozen of innocent kittens.

Our you could do this in correct way an implement your values as enum

public enum Something {
        SOMETHING_0(0),
        SOMETHING_1(1),
        SOMETHING_2(2);
        final int val;
        Something(int val){
            this.val = val;
        }
        static public  Something byNumber(int number){
            for (Something somthing : Something.values()){
                if (number==somthing.val){
                    return somthing;
                }
            }
            throw new RuntimeException("Value not found");
        }

    }

Upvotes: 3

Related Questions