bugfix> java > 投稿

シングルトンでは、使用の短所と利点は何ですか

private static final String QUERY = "some valid query";

以上

private final String QUERY = "some valid query";

回答 3 件
  • あなたの場合、不変オブジェクトがあります。

    final String s = "foo"; の宣言  または static final String s = "foo";  これは定数であるため、あまり変化しません。それは決して変わりません。
    常識はそれを static に設定するように言っています  作成されるインスタンスの数を制限します。 ( String は1つだけです  文字列プールのためにまだ作成されます)

    可変オブジェクトを要求する場合、これは異なります。たとえば、 Listfinal と宣言  後で変数を再初期化することはできませんが、コンテンツの変更はできません。

    private static final List<String> list1 = new ArrayList<>();
    private final List<String> list2 = new ArrayList<>();
    
    

    これにより、2つのリストが得られます。1つはすべてのインスタンスに共通です( static )およびインスタンスのメンバーであるもの。

    list1.add("foo");
    
    

    String を追加します  で list1  どのインスタンスからでもアクセス可能

    list2.add("foo");
    
    

    String のみを追加します  一例です。

    その場合は、 static と宣言します  違いが生じる・異なる。


    インスタンスメンバーのすべてのポイントは、コンストラクターではなく、宣言中に初期化された変数に基づいて行われます。

    private final String s;
    public MyClass(String s){
        this.s = s;
    }
    
    

    これは定数ではないため、そのケースは異なります。各インスタンスは異なる String を使用します  値。

  • 「静的最終」アプローチは、いくつかのことを行います。

    すべてのインスタンスで共有される1つのフィールドのみが作成されます

    フィールドは、クラスがロードされるときに作成されます

    フィールドは変更できません

    インスタンスを作成せずに、パブリックフィールドに他のクラスからアクセスできます。

    これは非常に一般的なアプローチであり、クラスのLoggerインスタンスを作成するなど、それが最良の選択肢である場所があります。文字列定数に関する限り。

    あなたの場合、文字列インターンにより、ランタイムは、含まれるクラスのすべてのインスタンスによって参照される文字列のインスタンスを1つだけ作成し、シングルトンでは、コンテナのインスタンスは1つだけになります。したがって、パフォーマンス上の利点はありません。

    とはいえ、定数の使用はベストプラクティスと見なされます。

  • ほとんどのBeanがシングルトンであるSpringパースペクティブでは、違いはありません。もう1つのポイントは、フレームワーク固有ではないコードを作成し、ベストプラクティスに従うことです。 Springはjavaですが、javaはSpringではありません(ご理解いただければ幸いです)。

あなたの答え