- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只能用例子来解释这个问题。
我们有主类AppServer
。它还包含几个应用程序范围的组件。
AppServer app = new AppServer(config, ...);
现在我们需要提供一个供应商来充当某些 Foo
实例的工厂。该供应商将在循环中被多次调用以创建一定数量的 Foo
实例。通过使用供应商,我们允许用户提供自己的 Foo
实现。请注意,Foo
不是我们的类,我们无法更改它。
唯一的问题是 Foo
需要应用程序中的一些组件。它们需要被注入(inject)/提供给 FooImpl
。
可以这样写:
app.setFooSupplier(() -> new FooImpl(app.component()));
这对我来说有点丑陋,想知道是否有更好的方法来做到这一点?到目前为止,这里有一些想法...
(1) 使用供应商后注入(inject)依赖(IoC方式)。
依赖关系是用 setter 定义的。所以我们在 sudo 中有类似的东西(在 AppServer
内部):
Foo foo = fooSupplier.get();
maybeInject(foo, component1);
maybeInject(foo, component2);
...
注入(inject)什么组件取决于setter是否存在。或者,我们可以使用 Component1Aware 接口(interface)并执行相同的操作,例如:
Foo foo = fooSupplier.get();
if (foo instanceof Component1Aware) {
((Component1Aware)foo).setComponent1(component1);
}
...
基本上是一样的。
我希望在构造函数中具有依赖项,以便表达需要设置它们。
(2) 使用可选的 Consumer
为 FooImpl
创建一个 Supplier
实例,该实例位于 AppServer
的同时 Consumer
中。像这样的东西:
public class FooImplSupplier implements Supplier<Foo>, Consumer<AppServer> {
...
}
然后我们可以非常轻松地注册该供应商:
app.setFooSupplier(new FooImplSupplier());
供应商创建实例(在AppServer
中)后,我们执行以下操作:
Foo foo = fooSupplier.get();
if (foo instanceof Consumer) {
((Consumer)foo).accept(this);
}
什么?
最佳答案
我总是喜欢通过构造函数(或静态工厂方法)传递强制设置,我更喜欢的 IoC 风格是
app.setFooSupplier(() -> new FooImpl(app.component()));
或者如果 app.component()
每次返回相同的内容,您可以编写以下内容。
Component comp = app.component();
app.setFooSupplier(() -> new FooImpl(comp));
这是迄今为止最简单也是最难出错的。例如您不能将参数传递 0 次或多次,或者在初始化之前尝试使用供应商。
关于Java8 供应商是可选的消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29273183/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!