使用一个带参数的 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 方法。
我第一次尝试做一些不是简单练习的 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 方法。