在Java中使用Wrappers作为适配器的正确设计模式是什么?

时间:2018-02-15 09:48:49

标签: java design-patterns

假设我们有一些Bean(这是POJO)

public class Bean {
}

我们有BeanWrapper,它是Bean的包装器,代表Bean类的DTO。还支持适用于Bean的适配器。

public class BeanWrapper {
    public Bean toBean() {}

    public static BeanWrapper fromBean(Bean bean) {}
}

问题在于方法fromBean。 该方法的正确设计模式应该是什么 - 它应该是静态方法吗?

换句话说,更好的是:

BeanWrapper wrapper = BeanWrapper.fromBean(bean);

或者只是非静态方法,并使用如下:

BeanWrapper wrapper = new BeanWrapper().populateBean(bean);

从评论中编辑: 或者使用构造函数:

BeanWrapper wrapper = new BeanWrapper(Bean bean);

哪一种比其他更好更优先?为什么会那样?

1 个答案:

答案 0 :(得分:1)

这取决于 - 所以基于意见。如果您正在使用CDI(内容依赖注入),最好先使用第一个选项注入包装器,并避免使方法保持静态。这是一个CDI环境,因为它更接近OO范例。

我的意见是只在绝对必要时才使用公共静态方法。例如工厂方法。

对于其他选项,所有选项都取决于您对团队的决定。尽管如此。

为什么我认为静态方法是邪恶的(在大多数情况下):

  • 像多态这样的OO原则只是被静态方法抛弃了。
  • 静态方法表示不知道它属于何处的方法。 OO宣传“谁负责”,每种方法都属于某种
  • 可测试性是一个问题。调用静态方法的每一段代码都需要完整地测试这个静态方法,因为编译器将静态方法原样“复制”到调用方法中。这使得无法维护的测试。
  • 他们可以被视为有点全球性的方法/程序。所以它所写的类实际上只是因为它的名字而不是它的状态或责任
  • 代码变得更加复杂,因为很难说它是什么,为什么应该使用它以及在什么情况下使用它。滥用很容易。

由于Java是OO语言,因此在该上下文中使用它是一种好习惯。考虑到恕我直言,在这些情况下使用公共静态方法是唯一的好处:

  • 工厂方法
  • 单元测试