【发布时间】:2023-04-01 18:41:02
【问题描述】:
我有senderA 和senderB 都实现sender 和两个单例,我有一个SenderWrapper(它可能实现ISenderWrapper)类,我想代表SenderA 和@987654327 @ 作为某种静态常量。
我正在获取实例,senderA 和 senderB 在运行时使用 Guice。
我在运行时创建了许多 SenderWrapper 类的实例(每个请求一个),我想以某种方式在这些类中表示 senderA 和 senderB。我将在SenderWrapper 中定义的一些方法中使用它们。
我有几个解决方案:
-
我有两个非静态字段
senderA和senderB,我从构造函数传递它们。 (也许我也可以注入它们,但我担心性能) -
我可以拥有
senderA和senderB的静态 字段,并在运行时在Guice模块中设置它们。但问题是这些字段不会是 const 并且会发送错误消息,表明它可以在运行时更改。
public class SenderWrapper implements ISenderWrapper {
public static Sender senderA = null;
public static Sender senderB = null;
public void dummyMethod() {
senderA.send(); senderB.send();
}
}
//in Guice module
@Provides
public providesSenderA(){
Sender senderA = new SenderA();
SenderWrapper.senderA = senderA;
return senderA;
}
- 我当前的解决方案是使用
Enum类来表示senderA和senderB。像
enum Senders {
senderA, senderB
}
我感觉这类似于第 2 点中提到的解决方案,至少在功能上是这样。我只是讨厌使用枚举。
解决这种情况最好、最优雅的方法是什么?我不介意重构,某种程度的间接来解决这个问题。
【问题讨论】:
-
使用枚举——一般来说,与你的问题无关——是你能做的最好的事情之一。在 Java 中,它们非常强大且易于使用,具有类类功能。而且您的 IDE 可以为您生成大量代码并检查不一致之处,您必须使用任何其他方式自行检查。
-
我不明白解决方案 2 的工作原理。请澄清。
-
@JayC667 编辑以提供示例
-
好的,我明白了。您可以使用它,但您必须自己初始化它或设置一些规则。我不了解 Guice,因此无法告诉您如何正确地依赖注入静态字段。仅供参考:我认为“静态”比“最终”更多是注入的问题,因为如果你有
final X x;,你可以“总是”稍后通过反射(思想缓存和 JVM 实现)设置 x,所以依赖注入框架/modules 将利用它。 -
如果您已经使用了 guice,那么额外的开销不是主要问题(如果有疑问,请衡量)。考虑使用一个返回 a 或 b 的提供程序。
标签: java oop guice dropwizard