Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 作为带有Guice的单例的Helper类_Java_Guice - Fatal编程技术网

Java 作为带有Guice的单例的Helper类

Java 作为带有Guice的单例的Helper类,java,guice,Java,Guice,我正在学习谷歌Guice。 我了解如何将接口绑定到其实现 现在,我有了以下帮助器类: class PersonHelper { public static FakeDatabaseConfiguration dbConfig; public PersonHelper(){ if (dbConfig == null){ dbConfig = new FakeDatabaseConfiguration(); dbConfig.setHo

我正在学习谷歌Guice。 我了解如何将接口绑定到其实现

现在,我有了以下帮助器类:

class PersonHelper {
   public static FakeDatabaseConfiguration dbConfig;
   public PersonHelper(){
      if (dbConfig == null){
          dbConfig = new FakeDatabaseConfiguration();
          dbConfig.setHost('127.0.0.1');
          dbConfig.setPort('3306');
          dbConfig.setUsername('root');
          dbConfig.setPassword('root');
       }
   }

   public List<Person> getPersons(){
      FakeResult fakeResult = dbConfig.executeSQL("select * from Person");
      return fakeResult.asList();
   }
}
类PersonHelper{
公共静态FakeDatabaseConfiguration dbConfig;
公共人事助理(){
if(dbConfig==null){
dbConfig=new FakeDatabaseConfiguration();
setHost('127.0.0.1');
dbConfig.setPort('3306');
dbConfig.setUsername('root');
dbConfig.setPassword('root');
}
}
公众人士名单{
FakeResult FakeResult=dbConfig.executeSQL(“选择*来自个人”);
返回fakeResult.asList();
}
}
今天,我这样使用它:

PersonHelper personHelper = new PersonHelper();
List<Person> personsList = personHelper. getPersons();
@Singleton  // Could also be in your module or @Provides method.
class PersonHelper {
  private FakeDatabaseConfiguration dbConfig;

  public PersonHelper(){
    dbConfig = new FakeDatabaseConfiguration();
    dbConfig.setHost('127.0.0.1');
    dbConfig.setPort('3306');
    dbConfig.setUsername('root');
    dbConfig.setPassword('root');
  }

  public List<Person> getPersons(){
    FakeResult fakeResult = dbConfig.executeSQL("select * from Person");
    return fakeResult.asList();
  }
}
PersonHelper PersonHelper=newpersonhelper();
List personlist=personHelper。getPersons();
我很确定有办法让这门课更好

问题:如何使用Guice将这个类作为一个单例,这样我就不会在每个实例上延迟加载
dbConfig
变量? (我读到有一个
@Singleton
注释,但它在Guice中被视为一个范围。)

问候

请查看这是否有帮助。
Singleton
部分可能适合您。

将其作为作用域正是您想要的:作用域有效地告诉Guice何时允许重用已创建的相同对象,对于
@Singleton
,答案是“始终”

如果您要这样列出该类:

PersonHelper personHelper = new PersonHelper();
List<Person> personsList = personHelper. getPersons();
@Singleton  // Could also be in your module or @Provides method.
class PersonHelper {
  private FakeDatabaseConfiguration dbConfig;

  public PersonHelper(){
    dbConfig = new FakeDatabaseConfiguration();
    dbConfig.setHost('127.0.0.1');
    dbConfig.setPort('3306');
    dbConfig.setUsername('root');
    dbConfig.setPassword('root');
  }

  public List<Person> getPersons(){
    FakeResult fakeResult = dbConfig.executeSQL("select * from Person");
    return fakeResult.asList();
  }
}
@Singleton//也可能位于您的模块或@Provides方法中。
类PersonHelper{
私有FakeDatabaseConfiguration dbConfig;
公共人事助理(){
dbConfig=new FakeDatabaseConfiguration();
setHost('127.0.0.1');
dbConfig.setPort('3306');
dbConfig.setUsername('root');
dbConfig.setPassword('root');
}
公众人士名单{
FakeResult FakeResult=dbConfig.executeSQL(“选择*来自个人”);
返回fakeResult.asList();
}
}
然后类本身就变成了一个单体。只要实例化该类,就会创建FakeDatabaseConfiguration,但对于通过Guice进行的所有访问,这只会发生一次


当然,这些都不适用于直接的构造函数调用,比如
newPersonHelper()
,但除了少数例外,Guice只擅长保证它提供的对象。Guice可以控制的任何访问,包括通过
getInstance
@Inject
-注释字段和构造函数,将只看到PersonHelper(因此FakeDatabaseConfiguration)创建一次。

首先,在您的模块中,您必须声明一个提供程序(
FakeDatabaseConfigurationProvider
)。如上所述,这是注入配置对象的最佳方式。 然后,将助手类声明为
单例
,并将其绑定到模块中。 这将允许您的助手类按如下方式使用:

public class SomeClass{
  @Inject
  private PersonHelper personHelper;
  ...
  public void someMethod(){
    ...
    List<Person> personsList = personHelper.getPersons();
    ..
  }
}

我确实读过那个答案,但我无法根据我的情况来调整它。你能用代码解释一下你的理解吗(如果可能的话,我的代码)?我认为在使用DI时避免使用“新”是一个很好的“经验法则”。在这种情况下:为什么要创建一个创建DB配置的单例“助手”?直接在模块中提供DbConfig,然后实现一个“提供程序”,该提供程序将注入配置并在其“get”方法中返回列表。这样,设置完全由模块管理,您不再需要助手。@Jan同意删除
new
,但强烈不同意通过使其返回值直接可注入来消除所有助手。对于事实上是提供者的助手,当然可以,但我不认为在这里是这样的,尤其是在涉及数据库调用和模型对象列表的情况下。仍然有足够的空间为单身助手注射,特别是如果他们被模拟测试。