我的同事和我的争执已经持续了几个星期。我想听听社区对此的看法。
我们在应用程序中使用 guice。在此应用程序的 UI 部分,我更喜欢通过 DI 和自定义注释(也称为工厂的位置)实例化所有字段和组件,并将它们连接到 buildUI 方法中。
看起来如下:
我的方法:
@Inject
@PreConfigured(caption="foo", width="100%")
Label field;
private void buildUI() {
this.addComponent(field);
}
我还为数据绑定和 i18n 编写了一些注释。
我的同事是这样做的:
他的方法:
private Label field;
private void buildUI() {
field = new Label();
field.setCaption("foo");
field.setWidth("100%");
this.addComponent(field);
}
这里的代码可能很长。考虑到数据绑定和其他主题,第二个代码可能会变得更长,而我的方法只是另一个注释。
我的理由是:
- 配置所有组件的行为和外观的中心位置
- 代码重用
- 性能 - 在长时间运行的应用程序中,组件的初始化代码变得“热”,jit 对其进行了更多优化。
- 更具可读性。
他的理由是:
- 可读性
- 视图代码不会散落在各处。
- 该课程没有 DI
- 依赖注入的灵活性被高估了,尤其是在注入具体类的情况下。
- 使用 DI 的唯一有效方法是构造函数注入。
但我也阅读了 Fowler 的一些文章,他在其中指出,setter 注入(用场注入代替)是一个糟糕的设计决策。但是在其他项目中没有任何重用的视图呢?
现场注入是一个糟糕的设计吗?或者上面介绍的另一种方式更优雅?
亲切的问候克里斯蒂安
PS:我知道讨论只是基于意见开始的,但这是一个长期持续的讨论(setter 与构造函数注入),这可能值得放手。