2017-09-26 14 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; 
} 

모든 것이 잘 작동하지만, 수중 음파 탐지기는 1 등석에 경고를주고있다 :

이 멤버 "보호"를 확인합니다. 라인

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

나는이 경고를 무시 하는가 또는 나는 그것을 보호로 변경해야합니까?

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

공개하지한다 :

+1

규칙 : 비공개로 시작하십시오. 필요할 때만 한 수준 위로 변경하십시오. 네가하려는 일과 프로젝트 구조가 어떨지 잘 모르겠다. 그래서 나는 네 질문에 답할 수 없다. – Maroun

+0

myMap을 비공개로 만들고 정적 접근 자 메서드를 만듭니다. –

답변

0

수중 음파 탐지기는 당신의 "회원"는 당신에게 제안을주고있다.

왜? public로이 떠나

다른 패키지에서 가 사용할 수 있습니다 - 그래서 당신은 모두에게 멤버를 노출합니다. 동일한 참조를 반환으로 막을 수 membersprivategetterssetters에 액세스해야 대부분의 경우에

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

- 그래서 당신은 당신 get 참조 또는 그 이전에 어떤 로직을 구현할 수 있습니다 코드 아래에는 member 직접 액세스하는 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)에 대해 자세히 알아보십시오.