【问题标题】:Design question - template pattern with enum implementing an interface设计问题 - 带有实现接口的枚举的模板模式
【发布时间】:2011-06-01 20:46:35
【问题描述】:

我的代码开始失控,所以我想我会寻求帮助。

我有一个实现接口的枚举类。该方法所做的第一件事是使用 jndi 从池中获取数据库连接。然后根据对象属性执行一系列计算并返回结果。

public interace MyInterface {  
     public ResultObject calculate(MyObject myObject); 

}

public enum MyEnum implements Myinterface {
    public ResultObject calculate(MyObject myObject) {
         //several steps
    }
}

只用一次计算就可以正常工作。我现在有更多的计算方法,每次计算只需进行一些更改。

模板方法设计模式听起来很适合这个,但我对如何使它与我目前拥有的枚举实现一起工作感到困惑?我不想在我的枚举计算方法中添加一堆分支语句并使其难以维护。

我正在使用 spring mvc,并且我为每个扩展一个基类的计算都有一个控制器。我在每个控制器中调用 super.calculate() 并且希望保持不变。

有人对这个场景有什么建议吗?我觉得刚开始的时候设计很好,但现在我不太确定了。

【问题讨论】:

  • 您是否希望每个枚举常量具有独特的、略有不同的行为?
  • 不,只有一个枚举常量。我只是想确保访问池的类是单例。

标签: java design-patterns spring-mvc enums


【解决方案1】:

我发现你会有一个实现这样的接口的enum 真的很令人困惑,特别是如果enum 负责与数据库交互 - 听起来你可能在滥用enums。

至于实际问题,我将创建一个基类(可能是抽象的),其中包含calculate(MyObject) 方法的核心逻辑,并将计算的“其他方法”委托给抽象方法或受保护方法覆盖-可以通过子类来实现,因此您可以对 MyInterface 进行稍微不同的实现,从而提供不同的行为。

【讨论】:

  • 与 Java 中的大多数东西一样,它不能与该语言的其他部分一起很好地工作。枚举有一些严重的限制(尽管与老式枚举相比它们相当先进......)。真的,考虑将它们转换为真正的类。
  • 我使用了一个枚举,因为我想确保它是一个单例。我在 Effective Java 中读到:“这种方法在功能上等同于公共字段方法,只是它更简洁,免费提供序列化机制,并提供针对多次实例化的铁定保证,即使面对复杂的序列化或反射攻击。虽然这种方法尚未被广泛采用,但单元素枚举类型是实现单例的最佳方式。”
  • 单例的另一种替代方法是跳过强制执行并且......只创建一个实例。
猜你喜欢
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 2011-06-29
  • 1970-01-01
  • 2020-11-15
  • 2020-11-28
相关资源
最近更新 更多