본문 바로가기

Programming/JAVA

java : public final static Color WHITE = new Color(255, 255, 255); 문제점

아직 디자인패턴에 대해 자세히 공부를 안하고 있어서 Singletone pattern은 논외로 하고 작성하겠습니다. 

위의 소스는 누구나가 언제든지 접근할 수 있는 Color type의 참조변수 WHITE를 생성하는것입니다.
더이상 이 WHITE 변수는 다른 Color type의 인스턴스를 참조할 수 없기때문에
언제든지 WHITE를 작성하면 매개변수가 255, 255, 255 인 인스턴스를 사용할 수 있는 것으로 보입니다.

여기엔 하나의 치명적일 수 있는 약점이 있습니다.

바로 인스턴스 필드값 자체가 바뀌는 가능성이 있다면 WHITE는 더이상
개발자, 사용자가 원하는 WHITE가 아닐 수 있다는 것입니다.

필드값 자체가 바뀔 가능성은 어떤 때에 있을까요??
(밑의 클래스는 예제를 위한 예제로 봐주시고 이해해주시길 바랍니다. ㅎㅎ)
class Color{
   private int red;
   private int green;
   private int blue;

   public Color(red, green, blue){
      this.red = red;
      this.green = green;
      this.blue = blue;
   }
//getter, setter, toString....
}

위와 같은 클래스가 있다면 실상
toString 메소드를 이용하여 클래스 필드들을 모두 출력한다면  //WHITE.toString();
Color [red=255, green=255, blue=255]
가 출력되겠지만

Color a = WHITE;
a.setRed(1);
라는 소스가 있다면
Color [red=1, green=255, blue=255]
으로 출력이 가능해집니다.

결국 참조변수를 final로서 상수처럼 쓰고자 선언을 할 때에는 이 final 참조변수는 어디에도 대입되지 않도록 
주의를 해야겠습니다.
특히나 이러한 final 참조변수가 static일 경우에는 더욱더 조심해야겠죠.
(사실 변수선언부터 깊이 있게 고민을 해야겠습니다. 공부하면 공부할수록 설계는 참 힘든 일이구나 합니다 ㅎ)