我如何通过其值获取 属性 的名称?
How can i get the name of a property by its value?
我有一个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
}
值是唯一的,我如何通过其值获取 属性 的名称?
通过反射,例如:
// intValue = 1
String getNameByValue(int intValue){
...
// returns "SOMETHING_1"
return nameOfProperty;
}
你可以用困难的方式做到这一点:
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 "";
}
如果你这样做,圣诞老人会去邮寄并屠杀十几只无辜的小猫。
我们可以以正确的方式执行此操作,将您的值实现为枚举
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");
}
}
一个选项是:
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);
如果 int
值是连续的,从 0
开始,那么您可以使用 enum
并且它是 ordinal()
位置:
public enum Something {
SOMETHING_0, SOMETHING_1, SOMETHING_2
}
// Use:
int value = Something.SOMETHING_1.ordinal();
String name = Something.values()[value].name(); // or toString()
如果 int
值 不是 连续的,您仍然可以使用 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()
或者,如果您希望显示文本与常量名称不同,并且您不喜欢异常,您可以这样做:
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");
我有一个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
}
值是唯一的,我如何通过其值获取 属性 的名称?
通过反射,例如:
// intValue = 1
String getNameByValue(int intValue){
...
// returns "SOMETHING_1"
return nameOfProperty;
}
你可以用困难的方式做到这一点:
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 "";
}
如果你这样做,圣诞老人会去邮寄并屠杀十几只无辜的小猫。
我们可以以正确的方式执行此操作,将您的值实现为枚举
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");
}
}
一个选项是:
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);
如果 int
值是连续的,从 0
开始,那么您可以使用 enum
并且它是 ordinal()
位置:
public enum Something {
SOMETHING_0, SOMETHING_1, SOMETHING_2
}
// Use:
int value = Something.SOMETHING_1.ordinal();
String name = Something.values()[value].name(); // or toString()
如果 int
值 不是 连续的,您仍然可以使用 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()
或者,如果您希望显示文本与常量名称不同,并且您不喜欢异常,您可以这样做:
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");