IT story

enum에서 내부 인터페이스를 구현할 때 순환 상속

hot-time 2021. 1. 6. 20:24
반응형

enum에서 내부 인터페이스를 구현할 때 순환 상속


컴파일러 오류를 제공하는 다음 구현이 있습니다.

public enum FusionStat implements MonsterStatBuilderHelper {
    ATTACK {
        @Override
        public MonsterCard.MonsterCardBuilder safeCreateBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard) {
            Objects.requireNonNull(baseMonsterCard);
            Objects.requireNonNull(fusedMonsterCard);
            Objects.requireNonNull(fusionCard);
            if (baseMonsterCard.equals(fusedMonsterCard)) {
                throw new IllegalArgumentException("baseMonsterCard and fusedMonsterCard need to be different");
            }
            return new MonsterCard.MonsterCardBuilder(baseMonsterCard)
                    .attack(baseMonsterCard.getAttack() + (fusionCard.getFusionPower() * fusedMonsterCard.getAttack()));
        }
    },

    HITPOINTS {
        @Override
        public MonsterCard.MonsterCardBuilder safeCreateBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard) {
            Objects.requireNonNull(baseMonsterCard);
            Objects.requireNonNull(fusedMonsterCard);
            Objects.requireNonNull(fusionCard);
            if (baseMonsterCard.equals(fusedMonsterCard)) {
                throw new IllegalArgumentException("baseMonsterCard and fusedMonsterCard need to be different");
            }
            return new MonsterCard.MonsterCardBuilder(baseMonsterCard)
                    .maximumHitpoints((int)(baseMonsterCard.getMaximumHitpoints() + (fusionCard.getFusionPower() / 100d * fusedMonsterCard.getMaximumHitpoints())))
                    .hitpoints((int)(baseMonsterCard.getHitpoints() + (fusionCard.getFusionPower() / 100d * fusedMonsterCard.getHitpoints())));
        }
    };

    protected interface MonsterStatBuilderHelper extends MonsterStatBuilder {
        default MonsterCard.MonsterCardBuilder safeCreateBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard) {
            return createBuilder(baseMonsterCard, fusedMonsterCard, fusionCard);
        }
    }
}

@FunctionalInterface
interface MonsterStatBuilder {
    MonsterCard.MonsterCardBuilder createBuilder(final MonsterCard baseMonsterCard, final MonsterCard fusedMonsterCard, final FusionCard fusionCard);
}

첫 번째 줄에 순환 상속 오류가 발생합니다 involving FusionStat.

나는 무슨 일이 일어나고 있는지 정확히 보지 못합니다. 나는 처음에 추상 클래스를 구현했고 enum이 클래스를 확장 할 수 없다는 것을 깨달을 때까지 enum이 그것을 확장하도록하고 싶었습니다. 이제 Java 8의 기본 메서드를 (남용) 사용하려고합니다.

내 코드가 컴파일되지 않는 이유에 대한 생각 프로세스에 관심이 있습니다 safeCreateBuilder. 중복 된 코드를 내부로 가져 와서 코드 중복을 제거하려고했습니다 (여전히 그렇게해야 함) .


이는 해당 클래스에서 상속하는 클래스 내부에서 구현 (상속)하는 인터페이스를 구현 (코딩)하고 있기 때문입니다.

그 문장을 더 좋게 만들 수 있으면 좋겠다 ...

그러나 여기에 시각적 인 예가 있습니다.

Class A implements Interface B {

    Interface B {
    }
}

As far as I know, this is not allowed. You need to define the interface outside of the class (in this case, an Enum).

Like so:

Interface B {
}

Class A implements Interface B {
}

Best practice is probably to break them up into different files.


FusionStat is defined as implementing MonsterStatBuilderHelper, yet inside this enum you try to declare the interface MonsterStatBuilderHelper which extends MonsterStatBuilder.

I suspect that what you want to do is simply define the method createBuilder() inside your enum.

If you do actually want to define the MonsterStatBuilderHelper interface, this needs to be done outside the class/enum.

ReferenceURL : https://stackoverflow.com/questions/23811904/cyclic-inheritance-when-implementing-inner-interface-in-enum

반응형