我的问题涉及Java中方法的特定设计约定......但实际上它也适用于C ++,C#和其他方法。我不知道这个约定是什么,但如果有一个标准化的约定,我想知道如何找到它。换句话说,我希望描述这个惯例,因为我遇到过它,并被引导到一个我可以学到更多东西的地方。
考虑java.util.Calendar,特别是它的孩子GregorianCalendar。它有一个有趣的“getter / setter”约定。假设您实例化此对象:
GregorianCalendar cal = new GregorianCalendar();
cal的字段现在描述了调用构造函数的瞬间(低至毫秒)。
现在假设您要访问年份字段或月份字段。您将使用以下getter。
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
请注意,它不是cal.getYear()或cal.getMonth()。看起来这个类只有一个getter方法,返回值由命名所需字段的参数决定。我想在类中有一个枚举设置列出字段......并且getter函数本身由某种switch语句组成。
这种类型的架构没有在我的任何一本书中描述......但是我在我目前的工作中一直在使用它...但我一直在“我的”方式(基本上只是制作)随着我走了)。如果有一种标准化的方式来做到这一点,其他人使用......我一定很想知道它。具体来说,使用enums和switch语句来控制方法的执行。
非常感谢您的时间!这是我在这个网站上的第一个问题......虽然我已经很久了。 :)
答案 0 :(得分:0)
实际上那些不是枚举。那些是整数。以下是Calender get方法的源代码:
public int get(int field)
{
complete();
return internalGet(field);
}
但是,有一种方法接受ENUM并根据它返回不同的值,这是一种很好的做法。
就设计模式而言,恕我直言,它是Factory
模式的变体。
答案 1 :(得分:0)
我实际上并不知道这个特定设计的名称,尽管我已经看到它在一些地方使用过。它当然不是标准设计模式之一"并且实际上太小而不能作为一种设计模式。它是通过多个getter和setter以更传统的方式实现封装的另一种方式。
如果我要称之为某种东西,它可能就像"灵活的吸气剂"或者"可扩展的吸气剂"。即"而不是拥有多个setter,让我们有一个灵活的getter"
如果我正在实施这样的事情,我可能会使用策略模式来做到这一点:
public abstract class Getter<T> {
private T getData(MyCalendar ob);
}
public static final Getter<Integer> MONTH {
Integer getData(MyCalendar ob) {
return ob.month;
}
}
然后你的get方法看起来像:
<T>public T get(Getter<T> toGet) {
return toGet.getData(this);
}
这使用多态来获取数据而不是大量的switch语句。它是完全灵活和可扩展的,同时仍然是类型安全等。
答案 2 :(得分:0)
首先,请注意API设计的两种方法并不相互排斥:可以同时使用“按索引获取”和“按名称获取”,即
int y1 = cal.get(Calendar.YEAR);
int y2 = cal.getYear();
int
类中由Calendar
常量控制的getter背后的主要驱动力是一致性:它允许Calendar
类的用户(例如日期格式化程序)构建代码按索引访问日历,无需进一步解释。例如,如果您想实现一个格式化程序,该格式化程序采用格式字符串并存储数据结构以从日历中提取数据,您可以使用整数数组来执行此操作:"dd-mm-yyyy"
将成为{{1你可以通过简单的int[] {Calendar.DAY, Calendar.MONTH, Calendar.YEAR}
循环从日历中获取数据。
请注意,for
使用整数常量而不是Calendar
的原因之一是向后兼容性:当enum
时Java没有enum
课程已经介绍。
另请注意,Calendar
或switch
常量上不需要enum
语句来实现int
的getter和setter:它们可以直接实现读取和写入日历组件数组。