2017-09-26 7 views
0

以下のクラスでは、私は他のクラスにマップにアクセスする必要がMYMAPソナーエラー - このメンバーを作る「保護」

public class AllMap { 
    public static final Map<String, String> myMap= new HashMap<>(); 
    static { 
     Map.put("yy", "AA"); 
     Map.put("xx", "BB"); 
    } 
} 

を宣言しています。

public class Test { 
    FieldMap.Map; 
} 

すべてが正常に動作しているが、ソナーは、第一クラス上の警告を与えている:

このメンバーは、「保護」してください。ライン

public static final Map<String, String> myMap = new HashMap<>(); 

私はこの警告を無視すべきか、私は保護に変更する必要がありますか?

public final Map<String, String> myMap = new HashMap<>();

パブリックではないください。

+1

経験則:プライベートから始め、必要なときにのみレベルを1つ上に変更します。私はあなたが何をしようとしているのかよく分からず、プロジェクトの構造はどうですか?私はあなたの質問に答えられません。 – Maroun

+0

私はmyMapをプライベートにし、静的なアクセサメソッドを作成します。 –

答えて

0

ソナーは、あなたの "メンバー" というあなたの提案を与えています。

なぜ? publicとしてこれを残し

は、他のパッケージからそれが利用できるようになります - あなたは皆にメンバーを暴露しています。コードの下に直接memberにアクセスしている:多くの場合

AllMap allMap = new AllMap(); 
allMap.myMap.put("X", "Y"); 

membersは、同一の参照を返すことで防ぐことができprivategetterssettersがアクセスし、する必要があります - あなたがあなたの前にいくつかのロジックを実装することができるようget参照またはsetです。

staticにする必要がある場合は、ゲッターとセッターをstaticにしてください。

0

変更可能なオブジェクトへの参照がクライアントコードに公開されているため、ソナーリントの問題が発生します。最終的なオブジェクトであるにもかかわらずマップを公開しています。クライアントはオブジェクトの内容を変更できます。

このようなフィールドをクライアント提供のオブジェクト参照に初期化したり、オブジェクト参照をアクセサから戻したりしないでください。

private static final SomeType [] THE_THINGS = { ... }; 
public static final List<SomeType> SOMETHINGS = 
    Collections.unmodifiableList(Arrays.asList(THE_THINGS)); 

Reference link

Reference link2

0

あなたが他のクラスにマップにアクセスする必要がある場合は、あなたが変更に対してそれを保護する必要があります。

import java.util.Collections; 
import java.util.HashMap; 
import java.util.Map; 

public class AllMap { 
    public static final Map<String, String> myMap; 
    static { 
     final Map<String, String> tmpMap = new HashMap<>(); 
     tmpMap.put("yy", "AA"); 
     tmpMap.put("xx", "BB"); 
     myMap = Collections.unmodifiableMap(tmpMap); 
    } 
} 

あなたはまだそれを使用してSonarQubeすることができますこれはエラーとしてマークされません(マップは読み取り専用なので)。

Collections#unmodifiableMap(Map)についてさらに読む。

関連する問題