kok202
Lombok을 사용할 때 List 타입 멤버변수 오버라이딩

2019. 4. 16. 11:40[개발] 기록

문제 상황

@Data
public class ParentElement{
        public String message;
}
@Data
public class ChildElement extends ParentElement{
        public String message;
}
@Data
public class Parent{
        public List<ParentElement> elements;
}
@Data
public class Child extends Parent{
        public List<ChildElement> elements;
}

Child 의 elements가 Parent의 elements를 오버라이딩 한 코드를 만들고 싶다.

 

 

 

 문제 해석

1. lombok 은 Child의 elements에 대응하는

public List<ChildElements> getElements() { return elements; }

public void setElements(List<ChildElement> elements) {this.elements = elements;}

를 만드려한다.

 

2. lombok 은 Child의 부모클래스 public List<ParentElement> elements; 에 대응하는

public List<ParentElement> getElements() { return elements; }

public void setElements(List<ParentElement> elements) {this.elements = elements;}

를 만드려한다.

 

3. 1번과 2번에서 만든 getter와 setter가 충돌을 일으킨다.

다른 타입을 반환하는 같은 이름의 메소드가 존재하기 때문

 

 

 

문제 해결

방법 1. 리스트 말고 배열을 쓴다. List입장에서는 Generic에 들어가는 클래스의 타입간의 상속관계를 알 수 없다. 배열은 상속 관계를 표현할 수 있다.

@Data
public class Parent{
        public ParentElement[] elements;
}
@Data
public class Child extends Parent{
        public ChildElement[] elements;
}

 

방법 2. getter setter 만 따로 지정해주고 멤버변수를 선언을 아예 하지 않는다.

//@Data
public class Child extends Parent{
        //public List<ChildElement> elements;
        
        public List getElements() {
                return super.getElements();
        }

        public void setElements(List elements) {
                super.setElements(elements);
        }
}

나중에 get set을 호출할 때 List<ChildElement>()으로 접근하면 된다.

List<ChildElement> list1 = Child.getElements(); 

List<ChildElement> list2 = new List<ChildElement>();

Child.setElements(list2);