본문 바로가기
java

[java] Enum Hierarchy(계층 구조) getChildren, getParent

by moonsiri 2021. 2. 2.
728x90
반응형

간단한 계층 구조 구현을 위해 Enum을 활용할 수 있습니다.

 

@Getter
public enum EnumHierarchy {
    A("에이", null),
        AA("에이에이", A),
        AB("에이비", A),
        AC("에이씨", A),
            ACA("에이씨에이", AC),
            ACB("에이씨비", AC),
        AD("에이디", A),
    B("비", null),
    C("씨", null),
    D("디", null),
        DA("디에이", D),
    ;

    private String name;
    private EnumHierarchy parent;
    private List<EnumHierarchy> children = new ArrayList<>();

    EnumHierarchy(String name, EnumHierarchy parent) {
        this.name = name;
        this.parent = parent;
        if (this.parent != null) {
            this.parent.addChild(this);
        }
    }

    private void addChild(EnumHierarchy child) {
        for (EnumHierarchy c = this; c != null; c = c.parent) {
            c.children.add(child);
        }
    }

    /**
     * 상위 모두 조회
     *
     * @return List
     */
    public List<EnumHierarchy> parents() {
        List<EnumHierarchy> parents = new ArrayList<>();
        for (EnumHierarchy c = this; c.parent != null; c = c.parent) {
            parents.add(c.parent);
        }

        return parents;
    }

    /**
     * 최상위 회사 조회
     *
     * @return EnumHierarchy
     */
    public EnumHierarchy topParent() {
        EnumHierarchy parent = null;
        for (EnumHierarchy c = this; c != null; c = c.parent) {
            if (c.parent == null) {
                parent = c;
            }
        }

        return parent;
    }

    /**
     * 하위 모두 조회
     *
     * @return List
     */
    public List<EnumHierarchy> children() {
        return this.children;
    }

    /**
     * 상위 체크
     *
     * @param parentCd String
     * @return boolean
     */
    public boolean isParent(String parentCd) {
        try {
            EnumHierarchy parent = valueOf(parentCd);

            for (EnumHierarchy c = this; c != null; c = c.parent) {
                if (parent == c) {
                    return true;
                }
            }
        } catch (Exception ignored) {}

        return false;
    }

    /**
     * 하위 체크
     *
     * @param childCd String
     * @return boolean
     */
    public boolean isChildren(String childCd) {
        try {
            EnumHierarchy child = valueOf(childCd);

            for (EnumHierarchy c : this.children()) {
                if (child == c) {
                    return true;
                }
            }
        } catch (Exception ignored) {}

        return false;
    }
}

 

 

아래와 같이 사용할 수 있습니다.

EnumHierarchy.A.children();    //  AA, AB, AC, ACA, ACB, AD
EnumHierarchy.ACB.parents();   //  A, AC
EnumHierarchy.ACB.topParent(); //  A
EnumHierarchy.A.isChildren("DA");  // false
EnumHierarchy.D.isChildren("DA");  // true

 

 

 

[Reference]

https://blog.naver.com/myh814/221987311674

728x90
반응형

댓글