2012-02-03 3 views
1

나는 false 또는 정수를 반환하는 메서드를 호출하고 싶습니다. 그것은 아주 잘 읽지 않는자바 - 내 제어 흐름에 대한 더 나은 관용구

int winningID = -1; 
if((ID = isThereAWinner()) != -1) { 
    // use the winner's ID 
} else { 
    // there's no winner, do something else 
} 

private int isThereAWinner() { 
    // if a winner is found 
    return winnersID; 
    // else 
    return -1; 
} 

내가 if((ID = isThereAWinner()) != -1) 비트를 좋아하지 않지만, C는 달리 당신은 자바에서 정수와 같은 논리 값을 나타낼 수 없습니다 순간 내 코드입니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

4
내가 매트의 대답에 비슷한 것을 사용하는 것이

:

class Result { 
    public static Result withWinner(int winner) { 
     return new Result(winner); 
    } 

    public static Result withoutWinner() { 
     return new Result(NO_WINNER); 
    } 

    private static final int NO_WINNER = -1; 

    private int winnerId; 

    private Result(int id) { 
     winnerId = id; 
    } 

    private int getWinnerId() { 
     return winnerId; 
    } 

    private boolean hasWinner() { 
     return winnerId != NO_WINNER; 
    } 
} 

이 클래스는 숨 깁니다 모든 승자가 없다면 실제로 어떻게 표현했는지 구현 세부 사항.

private Result isThereAWinner() { 
    // if a winner is found 
    return Result.withWinner(winnersID); 
    // else 
    return Result.withoutWinner(); 
} 

그리고 당신의 호출 방법 :

Result result = isThereAWinner(); 
if(result.hasWinner()) { 
    int id = result.getWinnerId(); 
} else { 
    // do something else 
} 

그것은 조금 너무 복잡 보일 수 있지만,이있을 것입니다 경우이 방법이 더 유연 당신의 우승자 찾는 방법 다음

미래의 다른 결과 옵션.

+0

답변 해 주셔서 감사합니다. Finisher의 정확한 순서와 같이 나중에 더 많은 데이터가 Results 클래스에 저장 될 수 있다는 사실을 좋아합니다. 그리고 말했듯이, 그것은 데이터를 이해하는 더 많은 방법을 가질 수 있습니다. 건배. – Joe

0

아마 코딩의 무신론에 대한 이해를 돕기 위해 예외를 고려할 수도 있습니다.

private int getWinnerId() { 
    // return winner id or -1 
} 

private boolean isValidId(int id) { 
    return id != -1; // or whatever 
} 
int winnerId = getWinnerId(); 
if (isValidId(winnerId)) { 
    ... 
} else { 
    ... 
} 

이 물론 모든 매우 주관적이지만 일반적으로 isFoo 방법은 단지 예/아니오 "대답"를 제공하지 기대 : 같은 대해 어떻게

3

.

+0

답장을 보내 주셔서 감사합니다. 나는 그것이 내가 생각하는 것보다 훨씬 낫다고 생각한다. – Joe

2

문제는 한 번에 두 개의 값을 반환하려고하는 것입니다. 당신이 취한 접근법은 이것에 대해 가장 간단합니다. 더 많은 객체 지향 또는 디자인 패턴 접근법을 원한다면 리스너 패턴을 사용합니다.

interface WinnerListener { 
    void onWinner(Int winnerId); 
    void noWinner(); 
} 

checkWinner(new WinnerListener() { 
    // handle either action 
}); 

private void checkWinner(WinnerListener wl) { 
    // if a winner is found 
    wl.onWinner(winnersID); 
    // else 
    wl.noWinner(); 
} 

이 접근법은 여러 인수 및 다양한 이벤트와 같은 복잡한 이벤트에서 잘 작동합니다. 예 : 여러 명의 수상자 또는 다른 유형의 이벤트를 가질 수 있습니다.

+0

답변 해 주셔서 감사합니다. 어쩌면 내가 원하는 것을 과잉 살 수도 있지만 매우 흥미 롭습니다. 건배. – Joe

1

저는 두렵습니다. 실수 (a == b)가 if (a = b) 인 경우 실수로 인한 오류를 피하기 위해 Java는 부울 유형과 숫자 유형 간의 변환을 제거합니다. 어쩌면 예외를 대신 시도해 볼 수도 있지만, 예외는 다소 문제가 있다고 생각합니다. (내 영어는 꽤 좋지 않다. 나는 분명히했는지 궁금하다.)

0

정수 대신 int를 사용하고 -1 대신 null을 반환한다. 이 시점에서 봐 : "나는하지 정수를 반환하고,하지만 승자가 승자의 정체성을 나타내는 없습니다 일부 개체 - 아니 인스턴스가."

0

Joe 또 다른 제안은 @Mat과 @buc를 기반으로 만들어졌으며 조금 전에 언급 했었지만 다시 이것은 주관적입니다. 물론 클래스/로직의 나머지 부분이 무엇인지 확실하지 않습니다. 코드/예제의 컨텍스트 내에서 의미가있는 경우 다른 ResultStatuses와 함께 열거 형을 도입 할 수 있습니다.

매트는

public enum ResultStatus { 
    WINNER, OTHER, UNLUCKY 
} 

이것은 잔인한뿐만 아니라 수/더는 (일부는 가독성을 호소 할 수있다) isValid 메소드는 부울 예를 반환하는 기대하지 않을 것이다 언급하고 논리의 나머지 부분에 따라 달라 (논리가 확장되는 경우)하지만 나는 그럼에도 불구하고 내 두 센트를 제안 할 것이라고 생각했습니다! 그래서 공개 클래스 (@bloc 제안과 비슷 함)에서 아래와 같이 체크 된 결과의 상태를 반환하는 메서드를 사용할 수 있습니다.

public ResultStatus getResultStatus() { 
    if (isWinner()) { 
     return ResultStatus.WINNER; 
    } else { 
     return isOtherCheck() ? ResultStatus.OTHER : ResultStatus.UNLUCKY; 
    } 
} 
관련 문제