gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:24:01 29 4
gpt4 key购买 nike

我第一次尝试做一些 OOP,这不是简单的练习,而是用 java 编写一个程序来存储有关人员的信息(如通讯录)。下面是我正在开发的名为 Person 的类的片段。 Person 将在将来的某个时间被其他类实例化。

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
}

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

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

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

最佳答案

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

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

我确实知道您的情况与日历情况略有不同,因为您的多个字段具有相同的“方面”(上次更新时间),但我仍然对它会是什么样子持谨慎态度调用者的视角。

(一般来说,我对在 getter 中使用参数没有任何问题。做任何能带来最有用的 API 的事情。)

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

关于java - 使用一个带参数的 getter,而不是使用多个不带参数的 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28893593/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com