2015-02-06 3 views
3
public class foo { 

private int a[]; 
private int b; 

public foo(){ 
    a = new int[] {1,2}; 
    b= 3; 
} 

public int[] getA(){ 
    return this.a; 
} 

public int getB(){ 
    return this.b; 
} 

는 나는이 같은 개체에 액세스하여의 값을 변경할 수 있다는주의 :배열에서 getter 메서드는 어떻게 작동합니까?

foo f = new foo(); 
f.getA()[0] = 5; // f.a[0] changes to 5 

을하지만 같은 것을 할 수 없습니다 :

f.getB = 5; // gives error 
f.getA() = new int[]{2,3}; //gives error 

수있는 사람을 어떻게 작동하는지 설명하고, 사용자가 배열 셀의 값을 변경하지 못하게하는 방법은 무엇입니까?

미리 감사드립니다.

+0

모든 자바 매개 변수와 결과는 값으로 전달됩니다. 배열 포함. 그러나 전달 된 값 (참조 유형의 경우)이 참조입니다. –

+0

http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value – robert

답변

7

Java에서 array는 참조 유형입니다. 즉, 배열 표현식의 값은 실제 배열을 참조합니다.

따라서 getA()의 반환 값은 개체 내부의 개인 배열에 대한 참조입니다. 이렇게하면 캡슐화가 중단됩니다. 개체 내부에 대한 액세스 권한을 부여합니다.

내부 배열의 복사본에 대한 참조를 반환하거나 개별 요소를 반환하는 다른 API (예 : getA(int index))를 제공하여 피할 수 있습니다.

+0

또는 OP 배열을 사용할 수는 없지만 예를 들어 Guava의'ImmutableList'처럼 불변의 콜렉션을 사용할 수는 있습니다. –

+0

귀하의 제안은 동일한 아이디어의 타사 구현을 사용하는 것입니다 ('ImmutableList'는 여전히 내부 배열을 사용합니다). –

+1

예. 나는 그저 분쟁을 일으키지 않고 당신의 답을 보완하려고 노력했습니다. –

1

f.get(A)은 배열에 대한 참조를 반환합니다. 배열에 액세스하는 방식으로 해당 배열에 액세스하고 f.get(A)[i]=...을 사용하여 해당 요소에 값을 할당 할 수 있습니다 (반환 된 배열을 변수에 저장하는 것이 더 좋지만 f.get(A)을 호출 할 필요없이 해당 배열에 여러 번 액세스 할 수 있습니다). 매번).

그러나 메서드 호출이 할당 연산자의 유효한 왼쪽이 아니므로 f.get(A)f.get(A)=..을 통해 할당 할 수는 없습니다. 알다시피, f.get(A)에 대한 호출은 foo 클래스의 멤버가 참조하지 않는 새 배열을 생성 할 수 있으므로 f.get(A)= new int[5];을 할당하면 새 배열을 저장할 변수가 없기 때문에 의미가 없습니다. 동일한 설명이 f.getB() = 5;에 적용됩니다.

+0

내 눈에 중요한 측면 인 왼쪽 언급이 중요 함 ;-) – Stefan

0

대신 발신자가 인덱스 게터

이제
public int getA(int n){ 
    return this.a[n]; 
} 

public void setA(int n, int x) { 
    this.a[n] = x; 
} 

을 사용할 수 있습니다 그들이 그것으로 좋아 할 수 있도록하기 위해, 배열을 멀리주는, 발신자는 배열에 액세스 할 수 없습니다 및없이 변경할 수 없습니다 너는 알고있다.

관련 문제