2012-03-15 5 views
2

매개 변수가 final로 정의 된 메소드가 있고이 메소드에서이 매개 변수의 값을 변경하고 리턴하면 최종으로 전달한대로 변경하면 안됩니다.
그러나 이것은 사실이 아닙니다.은 최종 매개 변수로 값을 전달합니다.

제발 이해해주세요!

public static void main(String[] args) { 
     EmployeeBean e1 = new EmployeeBean("1", "jitu"); 
System.out.println("object before set >>" + e1.getEmpName()); 

EmployeeBean newObj = x.changeFinalvalue(e1); 
     System.out.println("object after set >>" + newObj.getEmpName()); 


public EmployeeBean changeFinalvalue(final EmployeeBean x) { 
     x.setEmpName("Jeet"); 
     return x; 
    } 

출력 : 설정 >> jitu 후 객체

객체 지트 // 의심의 여지 >> 설정 후 :이 객체가되고있는 당신은 변경하지 않는 경우에만

답변

2

'jitu을'이어야한다 매개 변수에 의해 참조됩니다 (여기서 허용되지 않음). 대신 상태 (여기 입니다.)이 변경됩니다.

즉, e1 EmployeeBean 개체를 메서드에 전달하면 x 매개 변수는 e1이 참조하는 것과 동일한 개체를 참조하며 메서드 내에서이 매개 변수는 변경할 수 없으므로 다음 작업을 수행 할 수 없습니다.

public EmployeeBean changeFinalvalue(final EmployeeBean x) { 
    x = new EmployeeBean(); // changing the reference is not allowed! 
    return x; 
} 

하지만 개체의 상태를 변경하는 것은 허용됩니다.

이 문제를 방지하기 위해 알고있는 유일한 방법은 매개 변수로 전달 된 개체의 전체 복사본을 만들어 복사/복제 개체에서 작업하는 것입니다. 당신은 또한 EmployeeBean을 불변으로 만들 수 있습니다, 그렇다면 그것은 콩이별로 없을 것입니다, 지금 그렇게할까요?

편집 :이 질문은 여기 번을 묻는 메시지였습니다. 번, 조금 검색했을 때, 물론 발견했습니다. 이것에 대한 좋은 토론을 보려면이 링크를보십시오. '마지막'이 유일한 매개 변수 값이 변경되지 않았는지 확인합니다 때문에이 작품
java-final-keyword-for-variables
java-final-modifier

+2

_reference_는 final이지만 개체는 여전히 변경할 수 있습니다! –

+0

정확하고 잘 말했습니다! –

1

이유는이들이 메소드 매개 변수 또는 클래스 필드 여부를 최종 변수에 대한 일반적인 문제가 있습니다. 이 경우 객체에 대한 참조를 의미합니다. 개체의 필드는 계속 변경 될 수 있습니다.

다른 모든 최종 변수에서도 마찬가지입니다.

0

메서드의 매개 변수 선언 부분에있는 final 키워드는 메서드 내에서 다시 할당 할 수 없다는 것을 의미합니다 (예 : x = new EmployeeBean();). 그러나 명확하게, 이 속성을 변경하고 메소드가 객체에 대한 참조를 받기 때문에 메서드가 호출자에게 반환 된 후에 메소드의 객체 상태에 대한 변경 사항이 우선합니다.

변경되지 않도록하는 유일한 방법은 immutable으로 만드는 것입니다.하지만 특정 개체를 변경할 수 있는지 여부는 문제가 될 수 있습니다.

+0

하지만 나는 setter 메소드를 통해 변경 가능해야하므로 bean을 실제로 변경할 수 있다고 생각하지 않습니다. 깊은 사본을 만들거나 복제하는 것이 더 좋습니다. –

+0

@HovercraftFullOfEels 동의, 문제에 달려 있습니다. –

관련 문제