4

私は最近、次のように使用される遅延読み込み手法に恋をしました。

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() と同期でそれを行うことができることを知っていますが、静的なケースで可能なエレガントなテクニックが何らかの形でここでも使用できれば本当に感謝しています.

4

2 に答える 2

4

「エレガント」と思われるものは、経験豊富なプログラマーにとっては紛らわしく、ばかげているように見えます。

次の例を見ると、言語またはクラス ローダーの仕様によって引き起こされる暗黙的な副作用がないことがわかります。それが行うことはすべて、表示されているコードの中にあります。また、ごまかしは美しくないことも理解しています。

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

また、ハンマーに夢中になると、すべての問題が釘のように見え始めることに気付くかもしれません. :)

于 2012-04-24T12:40:49.037 に答える
0

あなたが説明する手法は、Java の遅延クラス読み込み (仕様で保証されている) に依存しているため、アプリケーション全体のシングルトンに対してのみ機能します。あなたが達成しようとしているのは、インスタンス変数を遅延初期化オブジェクトに渡すことです。アプリケーション全体のシングルトンであり、一度だけ初期化する場合でも、静的クラスが参照する静的フィールドにシードを書き込むことで機能させることができます。

于 2012-04-24T12:52:48.827 に答える