본문 바로가기
프로그래밍/JAVA

sonarQube - Public constants and fields initialized at declaration should be "static final" rather than merely "final"

by 애플 로그 2022. 7. 22.
반응형

sonarQube - Public constants and fields initialized at declaration should be "static final" rather than merely "final"

Making a public constant just final as opposed to static final leads to duplicating its value for every instance of the class, uselessly increasing the amount of memory required to execute the application.

Further, when a non-public, final field isn’t also static, it implies that different instances can have different values. However, initializing a non-static final field in its declaration forces every instance to have the same value. So such fields should either be made static or initialized in the constructor.

 

번역기 직역: 

(직역 내용은 어려우니 더 아래 내용 참고)

정적 최종 상수가 아닌 공개 상수를 최종 상수로 만들면 클래스의 모든 인스턴스에 대한 값이 중복되어 응용 프로그램을 실행하는 데 필요한 메모리 양이 불필요하게 증가한다.

또한 공개되지 않은 최종 필드가 정적이지 않은 경우 인스턴스마다 다른 값을 가질 수 있음을 의미합니다. 그러나 선언에서 비정적 최종 필드를 초기화하면 모든 인스턴스의 값이 같아집니다. 따라서 이러한 필드는 정적 또는 생성자에서 초기화되어야 합니다.

 

문제 코드

public class Myclass {
  public final int THRESHOLD = 3;
}

 

해결 코드

public class Myclass {
  public static final int THRESHOLD = 3;    // Compliant
}

 

상수 선언시 final 키워드에는 static을 붙이라는 것이다.

private final : 인스턴스 MyClass가 만들어질때 마다 새로 메모리 공간을 생성한다.

private static final :  메모리에 한번올라가면 같은 값을 클래내부 전체 필드 메서드에서 공유한다.

 

  • private final 의 경우는 값이 변하지 않을것인데도 불구하고 Myclass라는 인스턴스를 만들때마다 메모리공간을 새로 값을 할당 할 필요가 없다는 것이다.
  • 한번 메모리에 올려놓고 계속 같은 값을 쓰기위해서는 private static final을 써야 한다. 
  • 상수는 클래스내에서 똑같이 써야하는 값이므로 인스턴스가 만들어질때마다 새로 메모리에 올리는것이 무의미 하다는것이다. 

 

댓글