문제

게시 후 이 질문 읽기 는 중 하는 것도 가능하다는 사실을 깨달았을 알고 매우 중요합니다면 메소드는 null 을 반환하는 경우,또는 이것은 오류로 간주되는 조건과 예외가 발생해야하는 것입니다.거기에도 좋은 토론할 때 return'null'또는 예외 .

내가 쓰는 방법이고 나는 이미 알고 싶은 경우에는 null 을 반환 또는 예외를,무엇을 표현하는 가장 좋은 방법은 나의 결정을 즉,문서는 계약?

어떤 방법으로 내 생각할 수 있습니다:

  • 쓰고 그 아래에서양/문서(사람이 그것을 읽?)
  • 그것의 일부 메서드 이름(내가 제안 )
  • 가는 모든 방법 던졌 예외가 null 을 반환,그리고 모든 하나는'아니다'던지 null 을 반환합니다.

나는 주로 얘기하는 자바이지만,그것을 적용할 수 있는 다른 언어로,너무:왜 공식적인 방법으로 표현하는 경우 예외가 발생(이하 throws 키워드)그러나 형식적인 방법으로 표현하는 경우 null 을 반환될 수 있습?

가 없는 이유는 무엇입니까?무언가가 다음과 같다:

public notnull Object methodWhichCannotReturnNull(int i) throws Exception
{
    return null; // this would lead to a compiler error!
}

요약 및 결론

많은 방법으로 표현하는 계약:

  • 하는 경우 IDE 지원(로 IntelliJ),그것은 최고 사용하는 주석처럼 @NotNull 기 때문에 그것은 눈에 보이는 프로그래머에게 사용될 수 있는 자동화를 위한 컴파일 시간을 확인합니다.가 이클립스 플러그인 추가 지원이지만,그것은 작동하지 않았습니다.
  • 는 경우 이 옵션을 사용하여 사용자 지정과 같은 유형 Option<T>NotNull<T>, 하는,추가 명확성 및 적어도 런타임을 확인합니다.
  • 어떤 방법으로 문서화하고,계약에 JavaDoc 아픈 적이고 때로는 도움이 됩니다.
  • 는 방법을 사용하여 이 문서 null 허용 반환 값의 제안되지 않은 사람에 의해 하지만 나와 수 있습니다하지만 매우 자세한 정보 und 항상 유용하지 않습니다,나는 여전히 믿는 때때로 그것은 그것의 이점,too.
도움이 되었습니까?

해결책

아주 좋은 후속 질문. 나는 고려한다 null 진정으로 특별한 가치가 있고 메소드가 돌아올 수있는 경우 null Javadoc에서 명확하게 문서화해야합니다.@return some value ..., or null if ...). 코딩 할 때 방어 적이며 방법이 돌아올 수 있다고 가정합니다. null 내가 할 수 없다고 확신하지 않는 한 (예 : Javadoc이 그렇게 말했기 때문에).

사람들은 이것이 문제라는 것을 깨달았으며 제안 된 해결책은 주석을 사용하여 자동으로 확인할 수있는 방식으로 의도를 명시하는 것입니다. 보다 JSR 305 : 소프트웨어 결함 감지를위한 주석, JSR 308 : Java 유형에 대한 주석 그리고 JetBrain의 무효가되는 방법.

예제는 이것처럼 보일 수 있으며 IDE, 컴파일러 또는 기타 코드 분석 도구에 의해 거부되었습니다.

@NotNull
public Object methodWhichCannotReturnNull(int i) throws Exception
{
    return null; // this would lead to a compiler error!
}

다른 팁

당신은 사용할 수 있습니다 Option 유형은 0 또는 하나의 요소가있는 목록과 매우 유사합니다. 반환 유형 Option<Object> 메소드가 반환 될 수 있음을 나타냅니다 Object, 또는 특별한 유형의 값을 반환 할 수 있습니다. None. 이 유형은 더 나은 유형 검사와 함께 NULL을 사용하기위한 대체물입니다.

예시:

public Option<Integer> parseInt(String s) {
   try {
      return Option.some(Integer.parseInt(s));
   }
   catch (Exception e) {
      return Option.none();
   }
}

이것을 일관되게 사용하면 IDE Null-Warnings를 켜거나 Grep을 사용할 수 있습니다. null 사용하는 경우 코드에 전혀 나타나지 않아야합니다. Option.none() 당신은 어디에서나 정상적인 사용 a null 정확한.

Option 스칼라와 함께 표준으로 제공되며 호출됩니다 Maybe Haskell에서. 위의 링크는 호출되는 라이브러리에 있습니다 기능적 자바 여기에는 포함됩니다. 그 버전은 Iterable 인터페이스, 그리고 당신이 물건을 잘 구성 할 수있는 모나디 한 방법을 가지고 있습니다. 예를 들어, 경우 기본값 0을 제공합니다. None:

int x = optionalInt.orSome(0);

그리고 당신은 이것을 교체 할 수 있습니다 ...

if (myString != null && !"".equals(myString))

... 이것으로, 당신이 있다면 Option<String>...

for (String s : myOptionString)

실제로 : 우리의 프레임 워크에는 'non-null'포인터 유형이 있으며,이 방법은 항상 값을 반환한다는 것을 나타낼 수 있습니다.

세 가지 옵션이 있습니다.

  1. 언어 지원이 표현 될 때까지 기다립니다 (예 : 씨# ?! 물건)
  2. 측면 방향을 사용하여 자신의 언어 확장을 구축하여 표현하십시오.
  3. 사용자 정의 유형을 사용하여 표현하십시오
  4. (그러나 개발자 협력을 기반으로합니다) 명명 체계를 사용하여

Java의 경우 방법에 대한 Javadoc 설명을 사용하여 리턴 값의 의미를 문서화 할 수 있습니다. 언급 된 바와 같이, 주석은 여기에 도움을 줄 수 있습니다.

다른 한편으로, 나는 널을 두려워 할 무언가로 보지 않는다는 것을 인정한다. "Nobody 's Home"이 의미있는 조건 인 상황이 있습니다 (Null Object 기술은 여기에 실질적인 가치가 있지만).

널 값에 대한 메소드 호출을 시도하면 예외가 발생한다는 것은 사실입니다. 그러나 0으로 나누려는 시도도 마찬가지입니다. 그렇다고해서 0을 제거하기 위해 캠페인을해야한다는 의미는 아닙니다! 그것은 단지 우리가 방법에 대한 계약을 이해하고 그것이 반환하는 값으로 올바른 일을해야한다는 것을 의미합니다.

당신은 보았습니까? 투기#?

리턴 값이 NULL 일 수 있음을 나타 내기 위해 자신의 주석 (Java) 또는 속성 (C#)을 작성할 수 있습니다. 아무것도 자동으로 확인하지 않습니다 (.NET 4.0은 코드 계약 이런 종류의 경우) 그러나 적어도 문서로 작동합니다.

A에 대한 지원이 있습니다 Intellij 아이디어에서 @nullable 및 @notnull 주석. 또한 Java 7에 주석 (또는 유사한 기능)을 추가하는 것에 대한 이야기도 있습니다.

어쩌면 당신은 당신의 일반적인 클래스 이름은"NotNull",그래서 당신의 방법이 같은 수 있습니다:

public NotNull<Object> methodWhichCannotReturnNull(int i) throws Exception
{
   // the following would lead to a run-time error thown by the
   // NotNull constructor, if it's constructed with a null value
   return new NotNull<Object>(null);
}

이것은 여전히 런타임지 않는(컴파일 시간)확인만:

  • 그것은 던진에서의 구현 방법은(그것은 결함 부르는 코드)
  • 그것은 자기 문서화(호출자가 알고있는 그는 geting NotNull<T> 으로 복귀형)

모든 비용으로 Javadocs에 의존하지 마십시오. 사람들은 서명이 사소하고 자기 설명이없는 것처럼 보이지 않는 경우에만 읽습니다 (처음부터 읽기가 좋지 않음). .

Java 5+를 사용하는 경우 사용자 정의 주석 (예 : @mayreturnnull)을 사용할 수 있습니다.

업데이트

모든 코딩 철학을 제쳐두고 (예외, 어설 션, yada yada를 사용하여 널 반환) 위의 질문에 대한 질문에 답하기를 바랍니다. 기본값이있는 프리미티브와는 별도로 복잡한 유형은 무일하게 또는 그렇지 않을 수 있으며 코드는이를 처리해야합니다.

일반적으로 말하면, 널 리턴 값이 기본적으로 API의 계약에 위배된다고 가정합니다. "정상"실행 흐름 중에 NULL 값이 API에서 절대 반환되지 않도록 코드를 설계하는 것은 거의 항상 가능합니다. (예를 들어, foo.contains (obj)를 확인한 다음 foo.get (obj)를 호출하고 NULL에 대한 별도의 분기가 있습니다. 또는 사용하십시오. 널 객체 패턴.

그런 식으로 API를 설계 할 수 없다면, 나는 널이 언제, 왜 던져 질 수 있는지 명확하게 문서화 할 것입니다. 최소 Javadoc에서는 다른 답변 중 몇 가지와 같은 사용자 정의 @annotation을 사용하여 제안했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top