使用enums和switch语句来控制方法执行

时间:2014-05-28 12:20:15

标签: java methods enums getter

我的问题涉及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语句来控制方法的执行。

非常感谢您的时间!这是我在这个网站上的第一个问题......虽然我已经很久了。 :)

3 个答案:

答案 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课程已经介绍。

另请注意,Calendarswitch常量上不需要enum语句来实现int的getter和setter:它们可以直接实现读取和写入日历组件数组。