我最近爱上了使用如下的延迟加载技术:
public class SomeClass
{
static class ComplexClassHolder
{
static ComplexClass complex = new ComplexClass(); // takes a long time
}
static double someMethod(int x, int y)
{
return ComplexClassHolder.complex.calculate(x,y);
}
public double quickMethod() // if only this method is called there is no initialization of the instance of ComplexClass
{
return 1.0+1.0;
}
}
但是非静态方法也可以使用类似的技术吗?
例子
import java.util.Random;
public class SomeClass
{
final int seed;
public SomeClass(int seed)
{
this.seed=seed;
}
class ComplexClassHolder
{
Random r = new Random(SomeClass.this.seed); // let's pretend this takes a long time
}
public double randomDouble()
{
return ComplexClassHolder.r.nextDouble();
}
}
问题是以上是不可能的,因为 ComplexClassHolder 和 ComplexClassHolder.r 不是静态的。但是,如果我将它们设为静态,我将无法访问 SomeClass.this.seed。
我知道我可以使用 getInstance() 和同步来做到这一点,但是如果在静态情况下可能的优雅技术也可以在这里以某种方式使用,我将不胜感激。