Java 良好实践:保持局部变量作用域与依赖项注入

Java 良好实践:保持局部变量作用域与依赖项注入,java,dependency-injection,scope,guice,Java,Dependency Injection,Scope,Guice,良好的实践要求变量应尽可能声明为局部变量。然而,这阻碍了为了单元测试而进行依赖注入的良好实践 例如: Class A { public A() {} public void start() { Map<Integer, VirtualMachine> vms = VirtualMachine.getAllVMs(); // more code here } } A类{ 公共A(){} 公开作废开始(){ Map vms=

良好的实践要求变量应尽可能声明为局部变量。然而,这阻碍了为了单元测试而进行依赖注入的良好实践

例如:

Class A {

    public A() {}

    public void start() {
        Map<Integer, VirtualMachine> vms = VirtualMachine.getAllVMs();

        // more code here
    }
}
A类{
公共A(){}
公开作废开始(){
Map vms=VirtualMachine.getAllVMs();
//这里有更多代码
}
}
现在我无法对
start()
方法进行单元测试。(
getAllVMs()
在本例中恰好是一个静态方法,但它也可能是一个新的
对象。注意:我不想使用
powermock

所以我能做的就是使用
googleguice
注入它,但是如果我这样做,我需要给
vms
类范围,即使我只是在该方法中本地使用它

有没有办法解决这个问题,或者我是被迫将其设置为类字段


谢谢

如果该变量的值仅在单个方法调用中需要,请将其作为方法参数传递。如果它应用于多个独立的方法调用,提供一个公共上下文,则逻辑范围比方法“大”,并且应该是一个字段。

如果该变量的值仅在单个方法调用中需要,则将其作为方法参数传递。如果它应用于多个独立的方法调用,提供了一个公共上下文,那么逻辑范围比方法“大”,它应该是一个字段。

Hmmm所以你是说我应该将
Map
注入上一个类的字段(调用这个类的
start()
方法的字段),然后在每次调用
start()
方法时将其作为参数传递?@Tiberiu如果它在调用
start()
之间变化,则为yes(或者传递一些可以模拟的
VirtualMachineProvider
)。如果您只
start()
一次,那么您可能应该将映射传递到类的构造函数中。Hmmm所以您是说我应该将
map
注入到前一个类的字段中(调用此类的
start()
方法的字段),然后每次
start()时都将其作为参数传递
方法被调用?@Tiberiu,如果它在调用
start()
之间变化,则为yes(或者传入一些可以模拟的
VirtualMachineProvider
)。如果只
start()
一次,那么可能应该将映射传递到类的构造函数中。