2010-02-19 6 views
6

약간 혼란스러워하는 코드를 발견했습니다. 내가 분명히하고 싶은 2 가지 변종이 있습니다.Java에서 전달 된 최종 변수는 다른 쪽에서 최종적으로 유지됩니까?

예 1 :

public String getFilepath(){ 
     final File file = new File(this.folder, this.filename); 
     return file.getAbsolutePath(); 
    } 

은 무엇 file "final"선언의 목적이 될 것인가? Java 프리미티브가 값에 의해 전달되고 getAbsolutePath()이 단지 String을 반환하기 때문에 변수가 다른 쪽 (호출 메소드)에 final이되지 않을까요? 그리고 file 변수가이 두 줄의 범위 내에 만 있기 때문에 final 키워드의 목적을 실제로 볼 수 없습니다. 내가 빠진 것이 있습니까? 누구든지이 일을하는 이유를 보았습니까?

예 2

public String getFilepath(){ 
     final File file = new File(this.folder, this.filename); 
     return file; 
    } 

여기 때문에 실제 객체가 반환된다 .. 그는 file 변수가 일정하게 할 뜻/반대편 final ...? 그것은 말이되지 않는 것 같습니다.

일반적으로 변수 번호 액세스 유형없이 전달한 것처럼 보입니다. 마찬가지로, 나는 public 함수를 반환하는 함수에 private 변수를 가질 수 있습니다. 그러나 함수를 호출하여 변수를받는 변수는 액세스 한정자를 지정해야합니다. 따라서 public을 지정하면 반환 된 변수는 해당 범위에 public이됩니다. private을 지정하면 반환되는 변수는 해당 범위에 private이됩니다. final과 (와) 차이가 있습니까? 변수의 "일정"이 전달 될 수있는 것입니까? 자바에 대해 내가 알고있는 것을 고려할 때 이것은 다소 희박한 일이다.

아니면 완전히 누락 되었습니까? final 키워드의 다른 목적이 위 코드에 있습니까?

편집 : 나는 코드를 쓴 원래의 개발자와 다시 확인하고, 그는 단지 그가 원래 방법은 많은 이상이 될 것이라고 생각했기 때문에 final 키워드를 넣어했다 및 확인하고 싶었

그 파일은 전체적으로 일정하게 유지되었다. 또한 그는 일반적으로 변하지 않아야 할 변수를 원칙적으로 final으로 선언했으며 원칙적으로는 다음 두 가지 대답을 언급했다. 그래서 나는 표준적인 이유로 포함 된 단순한 추가 키워드로 너무 많이 읽은 것 같습니다. 모두에게 감사드립니다!

답변

3

일부 사람들은 최종 사용에 성능상의 이점이 있지만 결론적으로 입증 된 것은 아닐 수도 있습니다.

final 키워드의 주된 장점은 프로그래머가 클래스, 메소드 또는 필드를 변경하면 안된다는 것입니다.

변수 final을 선언해도 참조 된 개체가 변경되지 않는다는 점에 유의하십시오. 변수가 값을 재 할당 할 수 없다는 것을 의미합니다. File 개체를 내부적으로 변경할 수있는 변수 file의 메서드를 실행할 수 있습니다.

당신이주는 두 가지 방법에서 나는 file 변수를 final으로 만드는 데 가치가 없다고 봅니다. 일부 코드 규칙은 수정할 필요가없는 한 모든 변수를 final으로 만드는 것을지지합니다. 어떤 사람들은 그것을 구독하지 않습니다. 나는 이것을 precautionary principle의 변형이라고 생각합니다.

+0

final을 사용하면 더 나은 성능을 제공 할 수 있습니다 (예 : http://en.wikipedia.org/wiki/Memoization). – Stuart

+0

@ 스튜어트, 혼란스러워합니다. Memoization 최적화는 'final' 키워드와 관련이 없습니다 (Java에서 함께 사용할 수 있지만'final' 키워드는 Memoization 패턴의 고유 한 속도 이점을 제공하지 않습니다). – BrainSlugs83

+0

OP의 질문에 답을 얻지 못했습니다. p - a --s - e - d - 최종 변수가 Java에서 반환 되었습니까? –

13

final은 로컬 참조 file이 변경되지 않는다는 것을 의미합니다. 방법 외의 의미는 없습니다. 일부 코딩 규칙은 변경 될 필요가없는 한 모든 변수를 최종적으로 사용하도록 옹호합니다. 따라서 누군가가 그러한 지침을 따를 때 코드를 볼 수 있습니다.

+3

나는 이것이 nitpicking이라는 것을 알고있다. 그러나 나는 모든 문자열이 Java에서 불변하므로 "immutable"이 최선의 선택이 아닐 수도있다. 나는 상관없이 당신의 요점을 얻는다. – froadie

+5

나는 _reference_ 파일이 불변이라고 말했다. 나는. '파일'을 다른 '파일'개체로 가리킬 수 없습니다. 이것이 바로 Java에서 '최종'키워드의 의미입니다. 참조는 변경할 수 없습니다. 변경할 수없는 단어는 변경할 수없는 것을 의미합니다. 많은 문맥에서 사용될 수 있습니다. – Kris

관련 문제