簡體   English   中英

Java非延遲初始化非靜態方法?

[英]Java lazy initialization for nonstatic methods?

我最近愛上了懶惰加載技術,使用如下:

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()和同步來實現它,但是如果真的很感激,如果靜態情況下可能的優雅技術也可以在這里使用。

你所看到的“優雅”看起來讓有經驗的程序員感到困惑和愚蠢。

當您查看以下示例時,您會發現語言或類加載器規范沒有導致隱式副作用。 它所做的一切都在你看到的代碼中。 你也明白,詭計並不美麗。

public synchronized double getNextDouble() {
    if (r == null) {
        r = new Random();
    }
    return r.nextDouble();
}

你可能也會意識到,如果你愛上了一把錘子,你所有的問題都會開始像釘子一樣。 :)

您描述的技術依賴於Java的惰性類加載(由規范保證),因此它僅適用於應用程序范圍的單例。 您要實現的是將實例變量傳遞給惰性對象。 如果您仍然希望它是一個應用程序范圍的單例並且僅初始化一次,您仍然可以通過將種子寫入靜態類將看到的靜態字段來使其工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM