2013-05-21 1 views
4

는 다음 코드 조각을 고려?Java에서 Null 허용 참조를보다 간단하게 구분할 수있는 방법이 있습니까? 이 작업을 수행하는 더 간단한 짧은 방법이 :</p> <pre><code>if (foo != null && foo.bar != null && foo.bar.boo != null && foo.bar.boo.far != null) { doSomething (foo.bar.boo.far); } </code></pre> <p>내 질문은 간단하다 :

상세

: 체인의 각 부분을 검증 할 수있는 더 간단한 방법 내가 이와 비슷한 상상 것,이 .. 제 생각에는

if (validate("foo.bar.boo.far")) 
{ 
    doSomething (foo.bar.boo.far); 
} 
+6

페이지의 '데메테르의 법칙'... –

+0

'시도 {해봐요 (foo.bar.boo.far);} 자신의 발명에 캐치 (NullPointerException이 전자) { } '내 계산에 포함되지 않습니까? :) – macias

+0

아마도 일반적인 null 항목이 얼마나 많은지에 따라 달라 지므로 매우 비싸게 빨라질 것입니다. –

답변

5

그런가요?

if (FooUtils.isFarNotEmpty(foo)){ 
    doSomething (foo.bar.boo.far); 
} 

FooUtils

:

boolean isFarNotEmpty (Foo foo){ 
    return foo != null && 
      foo.bar != null && 
      foo.bar.boo != null && 
      foo.bar.boo.far != null; 
} 
+1

거의 같은 대답을 쓰려고했다 :), 거의 같은 이름! –

+0

패턴을 사용하기 위해 +1,보기가 간단합니다. –

+3

"냄새 나는 코드 숨기기"패턴. :) –

2

이 표현은 완벽, 아무것도 더 간단 할 수 없다

+0

나는 동의하지 않는다. 이것은 누군가가 원했던 것보다 지루하고 작성하기가 지루하고 유지해야 할 고통이 있습니다. 자바에서 할 수있는 최선의 방법이지만, 눈에 띄지 않습니다. –

+0

@tieTYT 당신의 솔루션은 흐름을 제어하기 위해 예외를 사용합니다. 이것은 약간 자세한 정보보다 훨씬 더 나쁜 것 같습니다. try/catch를 if 문으로 대체해서는 안됩니다. –

+0

@JoshuaBarr 1) 이것이이 표현이 완벽한 이유에 대한 이유는 아닙니다. 2) 일반적으로 동의하지만, 위반할만한 가치가있는 이유를주었습니다. 그 이유에 동의하지 않는다면, 이유를 알려주십시오. –

1

당신이 당신의 공용 변수를 캡슐화하고 그들을 위해 getter 및 setter를 만들고 당신이 당신의 게터 이러한 검사를 수행 할 수 있으며, 당신이 할 수있는 공공 인스턴스 변수를 사용하는 이유 그 중 하나가 null이거나 try-catch 블록에서이 문을 실행할 수 있지만 권장되지 않는 경우 새 Object()를 반환합니다.

+0

체인의 일부가 NULL이면 doSomething() –

+0

NullPointerException은 RuntimeException 유형이므로 코드가 짧아 지긴하지만 절대 포기해서는 안되지만 표준에 반하는 나쁜 관행이긴하지만 코드에 게시 한 코드는 문제가 없으며 함께 진행하는 것이 좋습니다. –

+0

내가 예외를 던지려 할 때 이미 왜 그것을 피하려고합니까? ... 내 코드는 좋지만 더 짧은 방법을 요구했습니다. –

0

불행히도이 작업을 수행 할 수있는 방법은 많지 않습니다. 여러분이 저에게 묻는다면, 자바 언어에 문제가 있습니다. Groovy에는 특별히이 목적으로 사용되는 Safe Navigation Operator ?.이라는 것이 있습니다. 과거에 내가해온 두 가지 일이 있습니다.

  1. Grisha 이미 준 대답, 그래서 그것을
  2. 이 순진를 액세스하는 코드를 작성 반복하지 않을 것이다, 그리고 NPE에 대한 시도/캐치 그것을 둘러싸고 있습니다.

    try { 
        if (foo.bar.boo.far != null) { 
         //do something 
        } 
    } catch (NullPointerException e) { 
        //do what you would do in an else 
    } 
    

내가하지 특히 ​​2 옵션처럼 수행하지만, 실제로 코드 청소기를 취하면 내가 말을 사용하는 것이 좋습니다 예를 들면 다음과 같습니다이다.

XML 스키마에 비해 매우 얇은 래퍼 라이브러리를 사용하면서 한 번만이 사례에 두 번째 옵션을 사용하기로 결정했습니다. 내가하지 않았다면, 코드는 널 체크를 잊어 버리기가 쉽고 중요한 로직을 복잡하게 만들었 기 때문에 유지하기가 더 어려웠을 것입니다. 나는 그것을 사용하는 것이 타당한 경우라고 생각한다. 이것이 당신의 API하십시오 consider some advice 경우

+0

체인의 일부가 NULL 인 경우 doSomething()을하지 않으려 고합니다. 그 가능성에 대한 예외가 발생하면 코드가 내 예제보다 악화됩니다. –

+0

@KhaledAKhunaifer : 내 코드에서 호출하지 않습니다. 체인 중 하나가 null 인 경우 doSomething(). 이것이 코드에서 한 곳이라면 if 문을 가지고 있는데, 나도 추천하지 않습니다. 그러나 내가했던 것처럼이 모든 곳에서 이와 같은 코드가 있다면 코드를 더 깨끗하게 만들 수 있습니다. –

+0

하지만 이미 피할 계획이라면 예외가 던져지면 어색 할 것입니다. –

0

이 코드를

try { 
    if (foo.bar.boo.far != null) { 
     //No object is null 
    } 
} catch (Exception e) { 
    // some object is null and causes null point exception. 
} 
+0

죄송 합니다만 이미 피할 계획인데 예외가 발생하면 어색합니다. –

1

을 시도하십시오.

"나는 이것을 10 억 달러의 실수라고 부릅니다." - 선생님 CAR 호어, 널 참조

+0

절대 그렇지 않을 수 있습니다. be null –

+0

이 모델에서 모든 nullpointer는 버그입니다. 이 가정을 감안할 때 타입 A가 실제로 A가 아님을 타입 시스템에서 다시 신뢰할 수 있습니다. –

+0

NullPointerException이 런타임 예외인지 이유를 알고 계십니까? 코드 –

관련 문제

 관련 문제