본문 바로가기

Programing/JVM(Java, Kotlin)

[Java Anti-pattern] Passing the Arbitrary Number of Arguments

자바에서는 "Arbitrary Number of Arguments"이름으로 임의의 개수의 인자를 받을 수 있는 ... 이라는 구문이 있다.

시스템에서 제공하는 printf가 그 예이다.

public PrintStream printf(String format, Object... args)


인텔리J에서는 다음과 같은 경고를 보여줄 때가 있다. (Github)

Reports any calls to a variable arity method where the call has a single argument in the variable arity parameter position, which is either a null or an array of a subtype of the variable arity parameter. Such an argument may be confusing as it is unclear if a varargs or non-varargs call is desired. For example System.out.printf("%s", null).     

예를 들자면 아래와 같은 Redis를 지우는 파라메터를 받는 경우이다.

public void remove(String key, String... values) {
redisTemplate.opsForSet().remove(key, values);
}

이 remove 메서드는 스프링의 org.springframework.data.redis.core.SetOperations의 remove 메서드 인터페이스이다.

Long remove(K key, Object... values);


다음과 같이 방어코드를 넣어도 마찬가지 이다.

public void remove(String key, String... values) {
if (values != null && values.length > 0) {
redisTemplate.opsForSet().remove(key, values);
}
}

아래와 같이 iteration을 도는 수 밖에 없는 것일까?

public void remove(String key, String... values) {
for (String value: values) {
redisTemplate.opsForSet().remove(key, value);
}
}