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 言论是邪恶的。任何使用它们的人都应该换掉 ;-) 好吧,我承认我有时会使用它们,但之后我总是会洗手。