如果我的客户定义如下: -
public interface Client {
void send(String message);
}
实施如下: -
final class SocketClient {
private Integer port;
@Inject
SocketClient(Integer port) {
this.port = port;
}
@Override
public void send(String message) {
System.out.println("Sending message:- "+message+" to port "+port);
}
}
我如何使用Guice实例化SocketClient的多个实例,每个实例连接到不同的端口?
答案 0 :(得分:2)
首先想到的解决方案是创建一个看起来像
的SocketClientFactory
界面
interface SocketClientFactory {
SocketClient createForPort(int port);
}
然后使用assisted injection extension获取工厂实例。
答案 1 :(得分:1)
你必须实现类似单例PortAllocator的东西,它跟踪它已经分配的端口。然后,您可以将其注入您的客户端:
@Inject
SocketClient(PortAllocator portAllocator) {
this.port = portAllocator.allocatePort();
}
PortAllocator可能类似于:
@Singleton
class PortAllocator {
private int nextPort = 1234;
int allocatorPort() {
return nextPort++;
}
}
如果您愿意,可以使用界面分离。您可能也想考虑线程安全性。
你可能会说你在这里没有从Guice那里得到太多东西,但是你正在进行内置的单一状态管理,缺乏静力学使得测试变得容易。