2014-05-23 5 views
3

내 코드에서 내 메서드가 null을 반환 할 수있는 상황을 발견했습니다. 이 경우에는 return null보다 예외를 던질 수 있습니다. 그러나 제 의견으로는 끔찍한 것처럼 보이기 때문에 저는 정기적으로 사용하고 싶지 않습니다. 코드 참조 :엘비스 연산자를 사용하여 예외를 throw합니다. Groovy

class Type{} 

@Field Queue<Type> q1 = [] as Queue 
@Field Queue<Type> q2 = [] as Queue 

Type regularMethod(){ 
    Type toReturn = q1.poll() ?: q2.poll() 
    if(toReturn == null) 
     throw new RuntimeException("was null value") 
    return toReturn 
} 
Type myMethod(){ 
    return q1.poll() ?: q2.poll() ?: exception() 
} 

Type exception(){ 
    throw new RuntimeException("was null value") 
} 

여기서 엘비스 연산자를 사용하는 것에 대해 어떻게 생각하십니까? 가독성이 더 좋습니까? 아니면 누구든지 더 나은 해결책을 제안 할 수 있습니까?

+0

감사를 사용. 당신은 나를 땅에 데려왔습니다. 그러나 주석에 대해서도 생각했습니다. like @ThrowAtNull – Ordon

답변

3

물론 그것은 선호도와 스타일의 문제이지만, 나는 그것을 좋아하지 않습니다. 목표는 최소한의 코드 줄 또는 가장 짧은 코드 줄을 사용하지 않는 것입니다. 목표는 간결한 표현 코드로 끝내는 것입니다. 그것은 종종 간략하게 발생하지만, 간결성이 주요 목표는 아닙니다. 나는 q1.poll() ?: q2.poll() ?: exception()이 인간이 분석하기가 특히 쉽지 않다고 생각한다.

1

제프와 동의합니다. 코드를 읽고 이해하기가 약간 어렵습니다. 나의 추론은 그것이 실제로 일어나고있는 것을 숨 깁니다. 물론 메서드 이름을 개선하여 (예 : throwNewRuntimeException) 메시지를 매개 변수로 가져 와서 더 명확하게 만들 수 있습니다. 그러나 나는 아직도 그것을 좋아하지 않는다. 이를위한 새로운 방법을 추가 할 필요가 없습니다. 나도 아마 당신의 regularMethod으로 정확히 작성 또는 것

이처럼 돌아 서서 :

Type alternativeMethod() { 
    if (q1.empty && q2.empty) 
     throw new RuntimeException('Both queues are empty') 
    return q1.poll() ?: q2.poll() 
} 

를이 버전에서는, 내가 의미가 명확하고 이해하기 쉬운 생각합니다. 보너스로 당신을 괴롭히는 혼란을 없앴습니다. 오류 메시지조차도 더 잘 설명됩니다.

0

구아바는 무엇입니까 preconditions? 그들은 자바이기 때문에 그루비에 적합합니다.

Preconditions.checkArgument((q1 && q2, "was null value") 

또는 고정 수입 당신이 응답 아마이 함께 멀리 간다

checkNotNull(q1 && q2, "was null value") 
관련 문제