source

스위치에서 null을 사용하는 방법

gigabyte 2022. 8. 16. 23:31
반응형

스위치에서 null을 사용하는 방법

Integer i = ...
    
switch (i) {
    case null:
        doSomething0();
        break;    
}

위의 코드에서는 스위치 케이스 스테이트먼트에 null을 사용할 수 없습니다.어떻게 다르게 할 수 있을까요?사용할 수 없습니다default뭔가 다른 걸 하고 싶거든요

이것은, 에서는 가능하지 않습니다.switch명령어를 입력합니다.확인하다null이 되기 전에switch:

if (i == null) {
    doSomething0();
} else {
    switch (i) {
    case 1:
        // ...
        break;
    }
}

에서는 임의의 오브젝트를 사용할 수 없습니다.switch스테이트먼트를* 참조해 주세요.컴파일러가 불평하지 않는 이유switch (i)어디에i는 입니다.Integer자바가 자동 언박스를 해제하기 때문입니다.Integer에 대해서int아시리아가 이미 말했듯, 언박싱은 한순간도 빠지지 않을 것입니다.NullPointerException언제inull.

* Java 7을 사용할 수 있습니다.Stringswitch진술들.

상세 정보switch(null 변수를 사용한 예 포함) Oracle Docs - Switch의 경우

switch ((i != null) ? i : DEFAULT_VALUE) {
        //...
}

switch(i)Null Pointer를 슬로우합니다.예외인 경우null왜냐하면, 이 경우,Integer으로int.그렇게case null그것은 불법이지만, 어쨌든 결코 도달하지 못했을 것이다.

당신은 내가 null이 아니라는 것을 확인할 필요가 있다.switch진술.

Java 문서에는 다음과 같이 명시되어 있습니다.

null을 스위치라벨로 사용하는 것을 금지하고 있기 때문에 실행할 수 없는 코드를 쓸 수 없습니다.스위치 식이 박스형 프리미티브타입이나 열거형 등 참조타입일 경우 런타임에 식이 늘로 평가되면 런타임에러가 발생합니다.

Swithch 문을 실행하기 전에 늘을 확인해야 합니다.

if (i == null)

"Switch 스테이트먼트" 참조

case null: // will never be executed, therefore disallowed.

지정:

public enum PersonType {
    COOL_GUY(1),
    JERK(2);

    private final int typeId;
    private PersonType(int typeId) {
        this.typeId = typeId;
    }

    public final int getTypeId() {
        return typeId;
    }

    public static PersonType findByTypeId(int typeId) {
        for (PersonType type : values()) {
            if (type.typeId == typeId) {
                return type;
            }
        }
        return null;
    }
}

일반적으로 이것은 데이터베이스의 룩업테이블과 일치합니다(거의 갱신되지 않은 테이블만 해당).

하지만 막상 사용해보니findByTypeId스위치 문(대부분 사용자 입력에서)으로...

int userInput = 3;
PersonType personType = PersonType.findByTypeId(userInput);
switch(personType) {
case COOL_GUY:
    // Do things only a cool guy would do.
    break;
case JERK:
    // Push back. Don't enable him.
    break;
default:
    // I don't know or care what to do with this mess.
}

...다른 사람이 말한 것처럼 NPE는 @가 됩니다.switch(personType) {제가 구현하기 시작한 회피책(즉, "솔루션") 중 하나는UNKNOWN(-1)유형.

public enum PersonType {
    UNKNOWN(-1),
    COOL_GUY(1),
    JERK(2);
    ...
    public static PersonType findByTypeId(int id) {
        ...
        return UNKNOWN;
    }
}

이제, 어느 부분에서 중요한지 null 체크를 할 필요가 없습니다.또, 어느 부분을 처리할지를 선택할 수도 있고, 하지 않을지를 선택할 수 있습니다.UNKNOWN(주의:-1비즈니스 시나리오에서는 그다지 식별하기 어려운 식별자입니다만, 사용 예에 맞는 것을 선택해 주세요).

당신은 그것을 만들어야 한다.

if (i == null) {
   doSomething0();
} else {
   switch (i) {
   }
}

일부 라이브러리는 내장된 Java에 대한 대체 기능을 제공하려고 시도합니다.switch진술.Vavr도 그 중 하나고 패턴 매칭으로 일반화 되어 있습니다.

다음은 해당 문서의 입니다.

String s = Match(i).of(
    Case($(1), "one"),
    Case($(2), "two"),
    Case($(), "?")
);

어떤 술어도 사용할 수 있지만 많은 술어를 바로 사용할 수 있습니다.$(null)만, 이vavr 라이브러리에 의존성이 필요합니다.다른 솔루션보다 더 우아한 솔루션이라고 생각합니다만, 여기에는 Java8과 vavr 라이브러리에 대한 의존성이 필요합니다.

이 경우에도 하실 수 있습니다.String.valueOf((Object) nullableString)

switch (String.valueOf((Object) nullableString)) {
case "someCase"
    //...
    break;
...
case "null": // or default:
    //...
        break;
}

관련 SO Q/A 참조: String.valueOf(null)가 NullPointer슬로우하는 이유예외

switch (String.valueOf(value)){
    case "null":
    default: 
}

@tetsuo의 답변에 근거해, Java 8:

Integer i = ...

switch (Optional.ofNullable(i).orElse(DEFAULT_VALUE)) {
    case DEFAULT_VALUE:
        doDefault();
        break;    
}

그럴수는 없어요.int, char, short, byte(int, char, short, byte) 스트링(Java 7 ) 。 무효로 하다
마크를 켜주세요.i스위치 전에 다른 상태로 합니다.

오늘 알게 된 바로는, 그것이 null을 체크하고 있는 경우라고 해서, 다른 움푹 패인 괄호를 넣을 필요는 없다는 것입니다.다음 중 하나를 수행할 수 있습니다.

if (i == null) {
    // ...
} else switch (i) {
    case 1:
        // ...
        break;
    default:
        // ...
}

또는

if (i != null) switch (i) {
    case 1:
        // ...
        break;
    default:
        // ...
} else {
    // ...
}

SWITCH가 어떻게 동작하는지 생각해 보세요.

  • 원형의 경우 자동 박스를 위한 NPE에서 실패할 수 있습니다.
  • 단, String 또는 Enum의 경우 equals 메서드를 호출할 수 있습니다.이 메서드에는 equals가 호출되는 LHS 값이 필요합니다.따라서 늘에서 메서드를 호출할 수 없는 경우 스위치는 늘을 처리할 수 없습니다.

언급URL : https://stackoverflow.com/questions/10332132/how-to-use-null-in-switch

반응형