背景:我正在使用Google Guice,因此更容易通过配置类,但我认为这不是最佳方式。
我有一个存储一些路径的配置类:
class Configuration{
String getHomePath();
String getUserPath();
}
我还有一个类“a”需要“homepath”和一个类“b”需要“userpath”。
通过类a和b的构造函数传递配置类或仅传递特定路径更好吗?
答案 0 :(得分:3)
如果您确实正确使用Guice,那么所有这样的配置都应该出现在模块“configure
方法中”。所以:
HomePath
和UserPath
。getHomePath()
将其替换为名为homePath的字符串字段成员。getUserPath()
将其替换为名为userPath的字符串字段成员。@Inject
注释(应该已经是)并接受一个String参数,分别用@HomePath
和@UserPath
注释并分配String字段成员注入的价值。.annotatedWith()
来定义正确的值;如果它们仅在运行时可用,则绑定提供者。E.G。
class a {
private String homePath;
@Inject
public a(@HomePath String homePath) {
this.homePath = homePath;
}
public String tellMeAboutHome() {
return "We live in a nice home called " + homePath;
}
}
class customModule extends AbstractModule {
public static final String userPath = "/home/rafael";
public void configure() {
bind(String.class).annotatedWith(HomePath.class).to("/home/");
bind(String.class).annotatedWith(UserPath.class).to(userPath);
}
}
如果创建注释对您来说太多了,请使用@Named注释Guice ships with。
答案 1 :(得分:1)
一般规则是使依赖图(哪些类知道或依赖于其他类/接口)尽可能简单,规则和固定的代码。
如果没有传递Configuration类使得a或b对用户编写的类没有依赖关系,或者为了避免依赖循环,则需要使用各个路径字符串。否则,如果更有意义地说'此类可以访问配置信息,以某种可能在将来发生变化的方式',则传递该类。
我会避免使用单例方法,特别是如果你已经设置了Guice。
答案 2 :(得分:1)
您的问题没有单一的答案,根据您的具体情况,只有可供选择的选项。
如果您知道Configuration
课程会增长 AND ,如果您的A
和B
课程可能会使用更多内容,那么通过整个Configuration
对象给它们的构造函数。注意:我知道这违反了YAGNI原则,但有时你可能知道你会需要它; - )
否则,您可以考虑使用@Named
注入路径,以便将A
和B
类依赖项降低到最小值,这是一个很好的设计实践。