"final" 클래스는 "protected" 멤버를 가져선 안됩니다

 

privateprotected의 차이점은 하위 클래스들이 protected로 선언된 멤버에는 접근할 수 있지만, private에는 접근이 안된다는 것입니다. 한편 final class는 하위 클래스가 존재할 수 없습니다. 따라서 멤버에 protected를 붙이는 것은 혼란스럽기만하고 무의미합니다.

클래스안의 protected 멤버는 동일한 패키지 내에 있는 다른 클래스에서도 확인 가능하고, 사용할 수 있습니다. 따라서 private를 사용한 것과는 다르게 의도치 않은 실수가 생길 수 있습니다.

규칙을 어긴 코드

public final class MyFinalClass {

  protected String name = "Fred";  // 규칙을 어긴 코드
  protected void setName(String name) {  // 규칙을 어긴 코드
    // ...
  }

}

규칙을 준수한 코드

public final class MyFinalClass {

  private String name = "Fred";
  public void setName(String name) {
    // ...
  }

}

예외

@VisibleForTesting 주석이 달린 멤버는 코드를 테스트에 사용할 수 있도록 의도적으로 접근제어자를 낮춘 행위이기 때문에 이 규칙은 무시됩니다.

public final class MyFinalClass {
  @VisibleForTesting
  protected Logger logger; // 규칙을 준수한 코드

  @VisibleForTesting
  protected int calculateSomethingComplex(String input) { // 규칙을 준수한 코드
    // ...
  }
}

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project