Yoda Condition์ ํ๋์ ๋ฒ์ .
Objects.equals(a, b)
if (Objects.equals(user.getStatus(), "ACTIVE")) { ... }
๋ฆฌํฐ๋ด ๋ฌธ์์ด์ ์ฝ๋์ ์ง์ ์ ์ง ์๊ธฐ.
private static final String STATUS_ACTIVE = "ACTIVE";
ํ๋์ฝ๋ฉ ๋์ :
if (STATUS_ACTIVE.equals(user.getStatus())) { ... }
์ ์ง๋ณด์์ฑ ์์น.
์:
Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
์๋ฏธ: "user ์์ผ๋ฉด unknown"
๋ช ํํ๊ณ NPE๋ ๋ฐฉ์ง.
Bad Case
if (user != null) {
if (user.isActive()) {
if (user.hasPermission()) {
// logic
}
}
}
Good Case
if (user == null) return;
if (!user.isActive()) return;
if (!user.hasPermission()) return;
// logic
โก ๊น์ด๊ฐ ์์์ง๊ณ ์ฝ๊ธฐ ์ฌ์.
์: if-else๋ก ํ์ ๋ณ๋ก ์ฒ๋ฆฌํ๋ ๊ฑฐ
Bad Case:
if (type == A) { ... }
else if (type == B) { ... }
else if (type == C) { ... }
Good Case:
Map<Type, Runnable> handler = Map.of(
A, () -> handleA(),
B, () -> handleB(),
C, () -> handleC()
);
handler.get(type).run();
Before:
List<String> filtered = new ArrayList<>();
for (String s : list) {
if (s.startsWith("A")) {
filtered.add(s);
}
}
After:
List<String> filtered = list.stream()
.filter(s -> s.startsWith("A"))
.toList();
โก ๋ชฉ์ ์ด ๋ช ํํจ.
IDE/๋น๋ ํ์์ null ๊ด๋ จ ๋ฒ๊ทธ๋ฅผ ์ก์ ์ ์์.
์:
public void doSomething(@NonNull String value) { ... }
ํนํ DTO/VO.
@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User { ... }
โก ์ฝ๋ ์ ์ค๊ณ ๊ฐ๋ ์ฑ ์ฆ๊ฐ.
Integer vs int ๊ฐ์ auto-unboxing NPE ์ฃผ์.
์:
Integer count = null;
int result = count; // NPE
โก ๊ฐ๋ฅํ๋ฉด primitive(int) ์ฌ์ฉ.
Before:
switch (role) {
case "USER":
return 1;
case "ADMIN":
return 2;
default:
return 0;
}
After:
return switch (role) {
case "USER" -> 1;
case "ADMIN" -> 2;
default -> 0;
};