Java 现场注射-这是一个坏习惯吗?
我的同事和我的争论已经持续了几个星期了。我想听听社区对此的意见 我们在应用程序中使用guice。在这个应用程序的UI部分,我更喜欢通过DI和自定义注释(也称为工厂的PlaceIn)实例化所有字段和组件,并将它们连接到buildUI方法中 情况如下: 我的方法:Java 现场注射-这是一个坏习惯吗?,java,dependency-injection,Java,Dependency Injection,我的同事和我的争论已经持续了几个星期了。我想听听社区对此的意见 我们在应用程序中使用guice。在这个应用程序的UI部分,我更喜欢通过DI和自定义注释(也称为工厂的PlaceIn)实例化所有字段和组件,并将它们连接到buildUI方法中 情况如下: 我的方法: @Inject @PreConfigured(caption="foo", width="100%") Label field; private void buildUI() { this.addComponent(field);
@Inject
@PreConfigured(caption="foo", width="100%")
Label field;
private void buildUI() {
this.addComponent(field);
}
private Label field;
private void buildUI() {
field = new Label();
field.setCaption("foo");
field.setWidth("100%");
this.addComponent(field);
}
我还为数据绑定和i18n编写了一些注释
我的同事是这样做的:
他的方法:
@Inject
@PreConfigured(caption="foo", width="100%")
Label field;
private void buildUI() {
this.addComponent(field);
}
private Label field;
private void buildUI() {
field = new Label();
field.setCaption("foo");
field.setWidth("100%");
this.addComponent(field);
}
这里的代码可能很长。考虑到数据绑定和其他主题,第二段代码可能会变得更长,而我的方法只是另一种注释
我的理由是:
PS:我知道讨论开始时只是基于观点,但这是一个长期的讨论(setter vs constructor injection),可能值得放手。字段注入比单独调用setter更好。你为什么要花时间打电话给特定的设定者。依赖项注入的全部目的是避免在业务逻辑中为setter编写锅炉板代码 我认为您的问题并不适合StackOverflow(查看常见问题),但我可以向您介绍我的想法 在这个问题上,我支持你的想法,因为你似乎已经在这个项目中使用了DI,那么为什么不使用它提供的功能呢 我对你的理由表示:
4中解释了它。
private
字段,也不涉及使用8-10个参数的构造函数。如果您想要不可变的对象,您可以使用Builder
模式,如果您想要单例,您可以放心,Spring的(我认为Guice有相同的概念)单例范围适合您。顺便说一句,这是常识:如果这是唯一有效的方法,就没有其他方法了,对吗- 您在一个模块中拥有所有绑定。想想这个模块能增长多大,特别是如果有很多屏幕的话。想一想这对可维护性的影响:现在一个想要改变一个屏幕的程序员必须
1- Know the DI framework 2- Find the module where the bindings for this screen are defined. 3- Scroll down to find the binding. 4- Make the change in the module, maybe also in the screen. 5- Commit changes for the module class, maybe also for the screen class.
- 使用DI意味着使用反射,这比不使用反射要慢
- 使您的代码依赖于第三方代码(DI框架)
- 布局的一部分仍然在屏幕中硬编码(容器视图是什么以及它们包含什么),另一部分在另一个模块中。单一责任原则被打破
- 注释是“脏的”:现在源文件用两种不同的语言编写。它的可读性较差,并且在使用自动代码分析工具时也会出现问题
- 很难编写单元测试(顺便说一句,测试应该使用DI框架来运行,这是一件坏事,如果有很多测试的话,速度会更慢)