Java 配置类-Guice的最佳实践

Java 配置类-Guice的最佳实践,java,configuration,guice,Java,Configuration,Guice,背景:我正在使用GoogleGuice,因此更容易通过配置类,但我认为这不是最好的方法 我有一个配置类,它存储一些路径: class Configuration{ String getHomePath(); String getUserPath(); } 我还有一个类“a”需要“homepath”,还有一个类“b”需要“userpath” 是通过类a和b的构造函数传递配置类,还是只通过特定路径传递配置类更好?一般规则是代码,使依赖关系图(哪些类知道或依赖于其他类/接口)尽可能简单、

背景:我正在使用GoogleGuice,因此更容易通过配置类,但我认为这不是最好的方法

我有一个配置类,它存储一些路径:

class Configuration{
   String getHomePath();
   String getUserPath();
}
我还有一个类“a”需要“homepath”,还有一个类“b”需要“userpath”


是通过类a和b的构造函数传递配置类,还是只通过特定路径传递配置类更好?

一般规则是代码,使依赖关系图(哪些类知道或依赖于其他类/接口)尽可能简单、规则和固定

如果不传递配置类使a或b对用户编写的类没有依赖性,或者是避免依赖性循环所必需的,则使用单独的路径字符串。否则,如果说“这个类可以访问配置信息,在将来可能会发生变化”更有意义,则传递该类


我会避免使用单例方法,特别是如果已经设置了Guice

你的问题没有单一的答案,只能根据你的具体情况选择

如果您知道您的
Configuration
类将增长,如果您的
A
B
类可能会从中使用更多,则将整个
Configuration
对象传递给它们的构造函数。注:我知道这违反了雅格尼原则,但有时你可能知道你会需要它;-)


否则,可以考虑使用<代码> @的代码> <代码>注入您的路径,以便减少<代码> < <代码> >代码> b>代码>类依赖关系到它们的最小值,这是一个很好的设计实践。

如果您真的使用Guice,那么您的所有配置像这样应该出现在模块“代码>配置< /COD>方法中。因此:

  • 删除配置类
  • 创建注释类,可能称为
    HomePath
    UserPath
  • 其中类a使用
    getHomePath()
    将其替换为名为homePath的字符串字段成员
  • 其中,类b使用
    getUserPath()
    将其替换为名为userPath的字符串字段成员
  • 将a类和b类构造函数修改为
    @Inject
    注释(应该已经注释),并引入一个字符串参数,分别用
    @HomePath
    @UserPath
    注释,并分配插入值的字符串字段成员
  • 在模块的configure方法中创建定义正确值的绑定;如果它们仅在运行时可用,请绑定提供程序
  • 例如

    如果创建注释对您来说工作量太大,请使用@Named annotation Guice

    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);
      }
    }