2013-12-18 7 views
4

의 내부 표현 노출 :객체의 필드 중 하나에 저장된 변경 가능한 객체 값에 대한 참조를 반환하는 다음 행에 대한 내 코드에 checkstyle을 실행할 때 나는이 오류를 받고 있어요 객체

@Override 
public String[] getDescriptions() { 
    return DESCRIPTIONS; 
} 

을하지만, 설명 IS NOT 변경할 수 있습니다.

"Returning a reference to a mutable object value stored in one 
of the object's fields exposes the internal representation of 
the object. If instances are accessed by untrusted code, and 
unchecked changes to the mutable object would compromise security 
or other important properties, you will need to do something 
different. Returning a new copy of the object is better approach 
in many situations." 

관련 질문 :

private static final String[] DESCRIPTIONS = new String[NUM_COLUMNS]; 

static { 
    // In a loop assign values to the array. 
    for (int i = 0; i < NUM_COLUMNS; ++i) { 
     DESCRIPTIONS[i] = "Some value"; 
    } 
} 

이 전체 오류 메시지입니다 : 그것은이 정의되어 Link

+0

항목은 변경할 수 있습니다. – bmargulies

답변

5

배열과 일부 컬렉션은 해당 내용이 여전히 변경 가능하다는 점에서 변경할 수 없습니다.

Java에서의 불변성은 객체의 참조 지정에만 영향을 주며 그 내용은 중요하지 않습니다.

이 시도 :

@Override 
public String[] getDescriptions() { 
    return Arrays.copyOf(DESCRIPTIONS, DESCRIPTIONS.length); 
} 

BTW, 자바 명명 규칙에주의 .. : descriptions를, 설명 내부하지 DESCRIPTIONS

+1

@Sotirios Delimanolis 예, 수정 불가능한 컬렉션은 이러한 종류의 변경 가능성에 대해 염려해서는 안됩니다. – Mik378

+0

이것은 우리 팀이 따르는 명명 규칙입니다 (매우 엄격하게). 빠른 설명과 가능한 솔루션을 주셔서 감사합니다. – user1071840

+0

@ user1071840 아주 이상한 대회;) 천만에. – Mik378

1

참조 변수가 그래서 당신은 DESCRIPTIONS 또 다른 배열을 할당 할 수 없습니다 final입니다. 그러나 객체 자체는 변경할 수 있습니다 (배열은 항상 변경 가능) final 또는 아닙니다. 참조를 반환하면 가변적 인 캡슐화 내용에 대한 제어권을 잃게됩니다.

배열의 복사본을 반환하거나 배열을 전혀 반환하지 않아야합니다. 배열의 특정 요소를 얻는 방법이 있으면 충분합니다.

+0

알았어요. 고맙습니다. – user1071840