質問

シングルトンオブジェクトのnotnullを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です。

障害が発生した後、Assertionがsystem.exit(0)を呼び出すと、アサーションが失敗した場合はありますか?

役に立ちましたか?

解決

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

他のヒント

によると そのクラスのドキュメント, 、それは本当にその議論を有効にする方法によって使用されることを意図しています。 (つまり、それはの施行を目的としています 前提条件。)ユニットテストが必要です ComponentFactory, 、そして彼らはその静的を主張すべきです getLibraryFrame() メソッドは返されません null, 、しかし、実行時にこれを主張する価値はありません。

JunitのAssertクラスを使用する場合、そこにあるすべての方法はすべて無効ですが、Junitフレームワークを使用して、テストが合格したか失敗したかを知ることができます。

これが単体テストの方法である場合、テストを実現しましたが、これが実行時間のメントである場合は、if条件を使用します。

を使用することをお勧めします 初期化オンデマンドパターン (すなわち、怠zyなロードシングルトン)シングルトン用。そのパターンでは、インスタンスの構築が失敗した場合、例外が得られます。そうしないと、オブジェクトが取得されます。

これにより、2つの方法でソリューションが向上します。同期のオーバーヘッドがなく、オーバーヘッドがありません。 Assert. 。両方の方法Singletonオブジェクトが作成されていない場合、両方の方法が例外を投げます - あなたのコードであなたは IllegalArgumentException アサートから。

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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top