2013-08-13 1 views
0

개인 메서드에 전달할 개인 최종 인스턴스 변수가있는 경우 매개 변수로 전달할 때 함수에서 final 한정자를 사용하여 다시 선언해야합니까? 예 :중복 선언은 피해야합니까?

public class GraphAlgo { 

    private final source; 

    public GraphAlgo(source) { 
    this.source = source 
    } 

    public void runAlgo() { 
    runAlgoUsingSource(source); 
    } 

    private runAlgoUsingSource(final source) { // here final is declared on a final field 
    //-- whatever. 
    } 
} 

이미 최종적인 매개 변수에 대해 final을 선언하지 마십시오. 장점. 중복 최종 수정자를 방지 단점 : 명시 적 그림을 제공하지 않습니다. 예 : GraphAlgo가 10000 라인 코드이고 'runAlgoUsingSource'함수를 보면 '소스'가 최종인지 아닌지를 시각적으로 알 수 없습니다.

이 경우의 일반적인 규칙은 무엇입니까?

+0

왜 이미 클래스의 멤버 인 경우 매개 변수로 전달하겠습니까? – aaronman

+3

이러한 변수 유형을 지정하고 혼동을 피하기 위해 다른 구문 오류를 수정하십시오. –

+3

두 개의'source' 변수는 완전히 다릅니다! 'GraphAlgo.source'는'runAlgoUsingSource'의 로컬 변수'source'와는 아무런 관련이 없습니다. 그들은 다른 유형을 가질 수 있습니다. 하나는 원시적 인 반면 다른 하나는 참조입니다. 당신이 그들을 혼동하지 않도록하는 것이 중요합니다. – yshavit

답변

4

여기에서 source은 이미 인스턴스 변수입니다. 왜 그것을 방법에 전달 하는가? 여기에 그 문제,

private runAlgoUsingSource(final source) { 

source

지금은 또 다른 변수를 들어, 로컬 변수로 범위, 그리고 인스턴스 변수와 동일한 이름. (또한 유형이 필요합니다.)이 로컬 sourcefinal인지 여부는 this.source (인스턴스 변수)이 final인지 여부에 달려 있습니다.

0

이것은 관례 상 문제가되지 않습니다. 2 개의 final 선언은 다른 것을 의미합니다. 필드의 값이 매개 변수로 유입 되더라도 필드는 final이고 매개 변수는 final이거나 그 반대 일 수 있습니다.

논쟁의 여지가 있지만 필자가 원한다면 매개 변수 final 만 선언해야한다는 것이고, 근본적으로 매개 변수를 선언해야하는 유일한 이유는 익명 내부에서 값을 사용하는 경우입니다. 수업. 반면 필드는 명시 적으로 수정하지 않는 한 final이어야합니다.

3

아니요, Use final liberally.

하나는 인스턴스 변수이다

private final SomeType source; 

및 다른 방법에 대한 것이다 :

private runAlgoUsingSource(final SomeType source) { 

첫번째 인스턴스 변수는 참조가 있는지가 없습니다 (변경 될 수 없다는 다른 객체를 참조하는 경우), 두 번째 매개 변수는 메소드 인수를 변경할 수 없다고 말합니다.

+2

+1 실제로'final'이'nonfinal'을 옵션으로 디폴트로 설정해야한다는 사실이 강하게 느껴집니다. 어쨌든'final' 로컬 매개 변수의 또 다른 용도는 그 메소드에서 선언 된 익명의 내부 클래스에서 그것을 참조해야 할 때입니다. –

0

두 개의 final 수정자는 관련이 없습니다. 하나는 인스턴스 멤버힙에 살고final입니다. 다른 하나는 메소드 을 로컬 변수 (동일한 이름을 공유하는 것)으로 만들고 스택final에 있습니다.

로컬 변수final을 표시하면 JVM이 특정 방법을 최적화 할 수 있으므로 (메소드가이를 수정하지 않는다는 것을 알기 때문에) 좋은 연습입니다. 인스턴스 멤버를final으로 표시하는 것은 실제 상수를 선언하는 선상에 있습니다.