본문 바로가기

Programing/JVM(Java, Kotlin)

[Java] Scope shadowing과 DCL51-J

가끔 sonarqube 돌려보면 DCL51-J 에 대한 코드 냄새가 잡힌다.

예를 들면 아래와 같다. 5번째 라인에서 지역변수 value를 사용하면 멤버변수인 value와 이름이 동일한데 사용했다고 경고를 한다.

public class Foo {
	private String valueType;
    
    public void foo(SomeParameter someParameter) {
    	ValueType valueType = someParameter.getValueType();
        if (valueType != null) {
        	this.valueType = valueType.name();
        }
    }
}

이럴 경우 어떠한 방법이 좋을까?

방법1. 지역 이름을 바꾼다. - 쉬우면서 명시적인 방법이다.

public class Foo {
	private String valueType;
    
	public void foo(SomeParameter someParameter) {
		ValueType value = someParameter.getValueType();
		if (value != null) {
			this.valueType = value.name();
		}
	}
}

만약 이게 가독성이 떨어지는 경우가 있다면 다른 방법을 써야 한다.

생각나는 것은 setter나 값을 가져오는 helper 메서드를 사용하는 것이다.

public class Foo {
	private String valueType;

	private void setValue(ValueType valueType) {
		if (valueType != null) {
			this.valueType = valueType.name();
		}
	}

    public void foo(SomeParameter someParameter) {
		setValue(someParameter.getValueType());
	}
}
import javax.annotation.Nullable;

public class Foo {
	private String valueType;

	public void foo(SomeParameter someParameter) {
		this.valueType = getValueBy(someParameter.getValueType());
	}

	@Nullable
	private String getValueBy(ValueType valueType) {
		if (valueType != null) {
			return valueType.name();
		}
		return null;
	}
}