使用一个带参数的 getter 而不是不带参数的多个 getter

Using one getter with an argument as opposed to multiple getters with no arguments

我第一次尝试做一些不是简单练习的 OOP 是在 java 中制作一个程序,它存储有关人的信息(如通讯录)。下面是我正在处理的名为 Person 的 class 的片段。 Person 将在未来某个时间被其他 class 实例化。

public class Person {
    // Enum of the fields in Person
    private static enum Field {NAME, ALIASES, DATE_OF_BIRTH, DATE_OF_DEATH, VITAL_STATUS,
        RELATIONSHIPS}
    private static enum VitalStatus {ALIVE, DECEASED, ASSUMED_DECEASED, UNKNOWN}

    private final int id;
    private Name name;
    private List<String> aliases;
    private GregorianCalendar dateOfBirth;
    private GregorianCalendar dateOfDeath;
    private VitalStatus vitalStatus;
    private List<Relationship> relationships;

    // Time field was last updated
    private Map<Field, GregorianCalendar> updateTimes;  

    // Initialise a blank/unknown person
    public Person() {
        this.id = getNewId();
        this.name = new Name(); // Blank name
        this.aliases = new ArrayList<String>();
        this.dateOfBirth = null;
        this.dateOfDeath = null;
        this.vitalStatus = VitalStatus.UNKNOWN;
        this.relationships = new ArrayList<Relationship>();

        // Initialise all update times to null
        this.updateTimes = new HashMap<Field, GregorianCalendar>();
        for(Field f : Field.values()) {
            updateTimes.put(f, null);
        }
    }


    // Update time methods
    private void updateUpdateTime(Field field) {
        updateTimes.put(field, new GregorianCalendar());
    }

    public GregorianCalendar getNameUpdateTime() {
        return updateTimes.get(Field.NAME);
    }

    public GregorianCalendar getAliasesUpdateTime() {
        return updateTimes.get(Field.ALIASES);
    }

    public GregorianCalendar getDateOfBirthUpdateTime() {
        return updateTimes.get(Field.DATE_OF_BIRTH);
    }

    public GregorianCalendar getDateOfDeathUpdateTime() {
        return updateTimes.get(Field.DATE_OF_DEATH);
    }

    public GregorianCalendar getVitalStatusUpdateTime() {
        return updateTimes.get(Field.VITAL_STATUS);
    }

    public GregorianCalendar getRelationshipsUpdateTime() {
        return updateTimes.get(Field.RELATIONSHIPS);
    }

    // Code removed from here down
}

我正在考虑用下面显示的代码替换更新时间的 getter。

public getUpdateTime(Field field) {
    return updateTimes.get(field);
}

我应该更换吗?我犹豫要不要用参数创建 getter,但它会减少代码行数,并允许我添加新字段和更新时间而无需编写新的 getter。

在这种情况下,您可能希望将其添加为 选项 ,但我一般不建议这样做。使用了 java.util.Calendar API(您指定要获取或更新的字段编号)和 Joda Time 的 APIs 和 java.time,您可以在其中说 getHour()getMonth() 等,后者 使用起来更简单。

忽略添加新字段需要多少行代码 - 专注于 使用 您提供的 API 是多么容易。调用者是否需要对字段进行泛化?如果是这样,那么拥有那个额外的方法就有意义了。如果不是 - 如果调用者总是在编译时在调用站点确切地知道他们想要哪些值 - 那么我会坚持使用原始形式。

我知道你的情况与日历略有不同,因为你对多个字段有相同的 "aspect"(最后更新时间),但我仍然对它持谨慎态度从来电者的角度来看就像。

(一般来说,我对在 getter 中使用参数没有任何问题。尽一切可能导致最有用的 API。)

顺便说一句,如果可能的话,我会避开 GregorianCalendar - 您真的希望呼叫者能够更改上次更新时间吗?他们现在可以,因为 GregorianCalendar 是可变的。切换到 Joda Time 或 java.time 如果你可能 可以。

有setter和getter意味着class可以满足成为JavaBean的要求

http://en.wikipedia.org/wiki/JavaBeans

这篇 link 描述了编写 javaBeans 的优点,还包括与 Spring、Stripes 等框架的可操作性

使用 IDE(例如 Eclipse)可以轻松创建 setter 和 getter 方法。