java万能集函数
java universal set function
我在考虑如何为所有字段实现设置功能,例如在日历中 class。
public class Test
{
int a,b;
// constructor, etc
set(int field, int value)
{
//--
}
}
//========
Test t = new Test();
t.set(Test.a, 5);
body 应该如何设置?
也许您应该尝试使用 Reflection API。使用它你的代码应该是这样的:
public void set(String fieldName, Object value){
Field f1 = this.getClass().getField(fieldName);
f1.set(this.getClass(),value);
}
请注意,此方法有很多注意事项,并且不遵循 Java 开发理念。仅当您确定自己在做什么时才使用反射 API。
只需用 field
的可能值定义一个 enum
,然后相应地执行:
public enum Field {
MONTH, DAY, YEAR;
}
public void set(Field field, int value) {
switch(field) {
case MONTH:
// use value to add months
break;
case YEAR:
// use value to add years
break;
case DAY:
// use value to add days
break;
}
}
您还可以为您的枚举定义一个 Map
并定义一个查找,如
更新
Where I can fing Calendar code?
在GrepCode中你会找到你需要的任何版本
不,没有办法将某种字段标识符传递给方法。
有多种方法可以达到类似的效果。最简单的可能是 EnumMap
。类似于:
enum Field {
AGE,
HEIGHT;
}
EnumMap<Field,Integer> values;
values.put(Field.AGE, 18);
如果您特别希望每个值都有不同的字段,那么您可以在枚举中嵌入用于设置和获取的逻辑。
class Person {
private int age;
private int height;
private int weight;
public enum Field {
AGE((p, n) -> p.age = n, p -> p.age),
HEIGHT((p, n) -> p.height = n, p -> p.height),
WEIGHT((p, n) -> p.weight = n, p -> p.weight);
private final BiConsumer<Person, Integer> setter;
private final Function<Person, Integer> getter;
Field(BiConsumer<Person, Integer> setter, Function<Person, Integer> getter) {
this.setter = setter;
this.getter = getter;
}
}
public void set(Field field, int val) {
field.setter.accept(this, val);
}
public int get(Field field) {
return field.getter.apply(this);
}
}
Person person = new Person();
person.set(Person.Field.AGE, 22);
int age = person.get(Person.Field.AGE);
如果你不使用 Java 8,你可以避免所有的 lambda,但代码要长得多。
这比使用 switch
语句要好。 switch
言论是邪恶的。任何使用它们的人都应该换掉 ;-) 好吧,我承认我有时会使用它们,但之后我总是会洗手。
我在考虑如何为所有字段实现设置功能,例如在日历中 class。
public class Test
{
int a,b;
// constructor, etc
set(int field, int value)
{
//--
}
}
//========
Test t = new Test();
t.set(Test.a, 5);
body 应该如何设置?
也许您应该尝试使用 Reflection API。使用它你的代码应该是这样的:
public void set(String fieldName, Object value){
Field f1 = this.getClass().getField(fieldName);
f1.set(this.getClass(),value);
}
请注意,此方法有很多注意事项,并且不遵循 Java 开发理念。仅当您确定自己在做什么时才使用反射 API。
只需用 field
的可能值定义一个 enum
,然后相应地执行:
public enum Field {
MONTH, DAY, YEAR;
}
public void set(Field field, int value) {
switch(field) {
case MONTH:
// use value to add months
break;
case YEAR:
// use value to add years
break;
case DAY:
// use value to add days
break;
}
}
您还可以为您的枚举定义一个 Map
并定义一个查找,如
更新
Where I can fing Calendar code?
在GrepCode中你会找到你需要的任何版本
不,没有办法将某种字段标识符传递给方法。
有多种方法可以达到类似的效果。最简单的可能是 EnumMap
。类似于:
enum Field {
AGE,
HEIGHT;
}
EnumMap<Field,Integer> values;
values.put(Field.AGE, 18);
如果您特别希望每个值都有不同的字段,那么您可以在枚举中嵌入用于设置和获取的逻辑。
class Person {
private int age;
private int height;
private int weight;
public enum Field {
AGE((p, n) -> p.age = n, p -> p.age),
HEIGHT((p, n) -> p.height = n, p -> p.height),
WEIGHT((p, n) -> p.weight = n, p -> p.weight);
private final BiConsumer<Person, Integer> setter;
private final Function<Person, Integer> getter;
Field(BiConsumer<Person, Integer> setter, Function<Person, Integer> getter) {
this.setter = setter;
this.getter = getter;
}
}
public void set(Field field, int val) {
field.setter.accept(this, val);
}
public int get(Field field) {
return field.getter.apply(this);
}
}
Person person = new Person();
person.set(Person.Field.AGE, 22);
int age = person.get(Person.Field.AGE);
如果你不使用 Java 8,你可以避免所有的 lambda,但代码要长得多。
这比使用 switch
语句要好。 switch
言论是邪恶的。任何使用它们的人都应该换掉 ;-) 好吧,我承认我有时会使用它们,但之后我总是会洗手。