2

シングルトンオブジェクトのAssert.notNullは必要ですか?

私はクラスを持っています:

public class ComponentFactory {
    private static LibraryFrame libraryFrame;

    public static synchronized LibraryFrame getLibraryFrame() {
        if (libraryFrame == null) {
           libraryFrame = new LibraryFrame();
        }
        return libraryFrame;
    }
}

今、それは次のように使用する必要があります:

LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame();
Assert.notNull(libraryFrame);
// other part

ここで、Assertクラスはorg.springframework.util.Assertです。

アサーションが失敗した場合、失敗が発生した後にSystem.exit(0)を呼び出す方法はありますか?

4

4 に答える 4

4

LibraryFrameインスタンスは常にこの時点で初期化されるため、アサートは必要ありません。

于 2012-02-18T17:07:30.463 に答える
2

そのクラスのドキュメントによると、それは実際にはその引数を有効にするためにメソッドによって使用されることを意図しています。(つまり、前提条件を適用することを目的としています。)の単体テストがComponentFactory必要であり、静的getLibraryFrame()メソッドが返されないことを表明する必要がありますnullが、実行時にこれを表明する価値はありません。

于 2012-02-18T17:10:19.820 に答える
2

JUnitのAssertクラスを使用すると、そこにあるメソッドはすべてvoidになりますが、JUnitフレームワークを使用して、テストが成功したか失敗したかを通知します。

これが単体テストの方法である場合は、テストを完了していますが、これが実行時のメントである場合は、if条件を使用してください。

于 2012-02-18T17:12:58.287 に答える
2

シングルトンには、初期化オンデマンドパターン(つまり、遅延読み込みシングルトン)を使用することをお勧めします。そのパターンでは、インスタンスの構築が失敗した場合は例外が発生し、そうでない場合はオブジェクトが取得されます。

これにより、ソリューションが2つの点で改善されます。同期のオーバーヘッドがないことと、のオーバーヘッドがないことAssertです。シングルトンオブジェクトが作成されていない場合、どちらのメソッドも例外をスローします。コードではIllegalArgumentException、assertからを取得します。

init-on-demandを使用すると、コードは次のようになります。

public class ComponentFactory 
{
  private ComponentFactory() 
  {
  }

  private static class LazyHolder 
  {
    public static final LibraryFrame INSTANCE = new LibraryFrame();
  }

  public static LibraryFrame getLibraryFrame() 
  {
    return LazyHolder.INSTANCE;
  }
}

それを使用するには、それでも次のようになります。

LibraryFrame libraryFrame = ComponentFactory.getLibraryFrame();

...あなたがもはやもAssertも必要もないことを除いてSynchronized

于 2012-02-18T17:20:51.440 に答える