스위치에서 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
언제i
이null
.
* Java 7을 사용할 수 있습니다.String
에switch
진술들.
상세 정보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)
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
'source' 카테고리의 다른 글
Java에서의 범용 삭제의 개념은 무엇입니까? (0) | 2022.08.16 |
---|---|
Windows OS용 OpenJDK 가용성 (0) | 2022.08.16 |
Java에서 Base64로 인코딩 (0) | 2022.08.16 |
값(vuej)을 전달하시겠습니까? (0) | 2022.08.16 |
Java 8: 여러 단위의 2개의 LocalDateTime 차이 (0) | 2022.08.16 |