implementacion - interfaces en java ejemplos
Herencia cíclica al implementar la interfaz interna en enumeración (2)
Esto se debe a que está implementando (codificando) la interfaz que está implementando (heredando) dentro de la clase que hereda de esa clase.
Desearía poder mejorar esa frase ...
Pero aquí hay un ejemplo visual.
Class A implements Interface B {
Interface B {
}
}
Hasta donde yo sé, esto no está permitido. Necesita definir la interfaz fuera de la clase (en este caso, un Enum).
Al igual que:
Interface B {
}
Class A implements Interface B {
}
La mejor práctica es, probablemente, dividirlos en diferentes archivos.
Tengo la siguiente implementación que da un error de compilación:
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);
}
Da un error de herencia cíclica en la primera línea que involving FusionStat
.
No veo exactamente lo que está pasando. Primero implementé una clase abstracta y quería dejar que la enumeración se extendiera hasta que me di cuenta de que las enumeraciones no pueden extender las clases. Ahora trato de (ab) usar los métodos predeterminados en Java 8.
Estoy interesado en el proceso de reflexión sobre por qué mi código no se compila, estaba intentando eliminar la duplicación de código (aún tengo que hacerlo), tirando del código duplicado dentro de safeCreateBuilder
.
FusionStat
se define como la implementación de MonsterStatBuilderHelper
, pero dentro de esta enumeración intentas declarar la interfaz MonsterStatBuilderHelper
que amplía MonsterStatBuilder
.
Sospecho que lo que quieres hacer es simplemente definir el método createBuilder()
dentro de tu enumeración.
Si realmente desea definir la interfaz MonsterStatBuilderHelper
, esto debe hacerse fuera de la clase / enum.