2010-06-09 4 views
6

광산 동료는 finally 블록에서 null을 참조합니다. 나는 이것이 넌센스라고 생각한다.reference = null을 finally 블록에 설정 하시겠습니까?

public Something getSomething() { 
    JDBCConnection jdbc=null; 
    try { 
     jdbc=JDBCManager.getConnection(JDBCTypes.MYSQL); 
     ... 
    } 
    finally { 
     JDBCManager.free(jdbc); 
     jdbc=null; // <-- Useful or not? 
    } 
} 

당신은 어떻게 생각하십니까?

+0

* 정확한 * 코드의 경우 try/finally를 사용하는 것이 중요하지 않습니다. getConnection에 의해 예외가 발생하면 jdbc는 null이므로 free는 아무 것도하지 않습니다. 아마 임무와 시험 끝 사이에 뭔가가있을 것입니다. –

+0

귀하의 동료가 그렇게하는 이유는 무엇입니까? –

+0

나는 생각하기에, 그는 그것이 "깨끗한"것으로 생각하고 기억을 저장할 것이다. – deamon

답변

11

jdbc은 로컬 변수이므로 메서드가 jdbc을 반환 할 때 범위를 벗어나서 null로 설정하는 것과 실질적으로 동일한 가비지 수집 대상이됩니다. 따라서 다음 코드 행의 범위를 벗어나면 변수를 null로 설정하는 것이 중요하지 않습니다.

변수를 필요한 최소 범위로 제한하는 것이 좋습니다. 예 : for 루프 안에 변수 만 있으면 for 루프에서 선언하고 코드가 for 루프를 종료하면 가비지 콜렉션을 사용할 수 있습니다. 메소드의 복잡성을 줄이는 것은 물론 로컬 변수를 null로 설정하는 필요성을 줄여 주므로 코드가 모듈화되고 읽기 및 유지가 쉬워집니다.

2

예, 이것은 꽤 난센스입니다. 동기는 대개 가비지 수집기를 "돕는"것이지만, 참조가 어쨌든 지워지기 때문에 이것은 실제 도움이되지 않습니다. 적어도 VM에는 해당되지 않지만 해가되지는 않습니다. 눈과 정신은 다른 문제입니다.

그러나이 예에서는 Something을 반환하지 않습니다. 예제가 불완전하고 finally 블록 다음에 실제로 선언문이있는 경우 jdbc를 null으로 설정하면 사용을 제한 할 수 있으며 즉시 발생하는 NPE는 finally 블록 이후의 사용에 대해 알립니다.

5

로컬 변수이므로 어쨌든 범위를 벗어납니다. 말도 안돼.

긴 수명의 개체의 인스턴스 변수 (멤버 변수) 인 경우 그렇지 않으면 가비지 수집기가 개체를 삭제하지 못하게되므로 유용 할 수 있습니다.

-2

방금 ​​메서드를 끝내는 대신 finally 블록 뒤에 코드가 더 많으면 가비지 수집기가이를 정리하는 데 도움이 될 수 있습니다.

+0

그 이상으로 - 프로그래머가 jdbc를 사용하지 못하게 할 수 있습니다. –

+1

아니요, gc를 청소하는 데 도움이되지 않습니다. JVM 스펙은 추가 계산에 도움이되는 참조 만 도달 할 수 있다는 점을 분명히 알고 있으므로 Null을 가져 오지 않고 NPE를 얻지 못하면 null이 적용되지 않습니다. null로 NPE를 얻으면 코드가 손상된 것입니다. 선언문 주위에 여분의 {}을 두는 것이 더 쉽습니다. 또는 컴파일러가 컴파일 타임에 사용되는지 여부를 알아보기 위해 더 나은 리팩터링을 별도의 메소드에 사용하는 것이 더 쉽습니다. –

+0

jdbc는 이미 null입니다. –

1

이 특별한 경우 기술적으로 말하면 정말 쓸모가 없습니다. 메서드가 반환되면 jdbc은 더 이상 존재하지 않으며 연결에 대한 참조를 보유하지 않으므로 가비지 수집에 영향을 미치지 않습니다.

코딩 스타일에 대한 질문입니다. 언젠가 finally 블록 다음에 코드를 더 추가하면 작은 이점이 있습니다. 그렇다면 jdbc을 더 이상 사용할 수 없다는 것이 immediatly 명백합니다. 왜냐하면 JDBCManager에 의해 free가 되었기 때문입니다.

그래, 폐기 된 리소스에 대한 참조를 무효화하는 것이 좋습니다.

+0

+1 지정된 참조가 유효하지 않음을 _programmer_에 표시합니다. –

+0

그 답변을 downvoted 누구 - 난 당신의 이유를 알고 행복 할거야. 정말! –

1

이미 작성되었으므로,이 경우에는 마지막으로 끝나기 때문에 쓸모가 없습니다.
try-finally 다음에 코드가 있으면 결국 사용하지 못하게 될 것입니다. 그리고 도움이 될만한 상황이 있습니다.
Java Memory Puzzle

0

다음에 반환하기 전에 모든 메소드에서 모든 로컬 변수를 null로 설정해야합니다.

JVM은 아마 어쨌든 라인을 최적화 할 것이므로 런타임 효과는 전혀 없습니다.

관련 문제