В настоящее время я работаю над карточной игрой на Java, похожей на старую Pokémon. Теперь я хочу как-то определить все карточки, но поскольку есть много полей, которые нужно инициализировать, я думаю об альтернативных способах, потому что конструктор будет очень длинным и трудно читаемым для каждой карточки , Я также должен инициализировать атаки, что означает, что я должен в основном создавать анонимный внутренний класс (термин правильный?) Каждый раз, например так:
/**
* Base set Abra 43/102
*/
public final class Abra extends Pokemon
{
public Abra()
{
super(
new ImageIcon("img/scans/base-set/43-abra.jpg"),
"Abra",
"Base Set Abra",
null,
Type.PSYCHIC,
Type.PSYCHIC,
Type.NONE,
30,
0
);
attack1 = new Attack("Psyshock", Type.NORMAL)
{
/**
* 10 damage. Flip a coin. If heads, the Defending Pokémon is now Paralyzed.
*/
public void doAttack()
{
damageApplyWeaknessAndResistance(10);
if (gui.frames.CoinFlipDialog.showCoinFlipFrame() == CoinFlip.COIN_HEADS)
{
Game.getOpponentPlayer().getActivePokemon().status = Status.Paralyzed;
}
}
};
attack2 = null;
}
}
Итак, мой второй вариант - создать иерархию с интерфейсами и абстрактными классами, что означает, что значения не будут храниться в полях, а будут просто возвращаться методами при необходимости:
public interface Card extends Cloneable, MouseListener, MouseMotionListener
{
public String getFullName();
public ImageIcon getSmallIcon();
public ImageIcon getFullIcon();
}
public interface Pokemon extends Card
{
public String getName();
public int getHPLeft();
public int getMaxHP();
public Type getType();
public Type getWeakness();
public Type getResistance();
public int getRetreatCost();
public Attack getAttack1();
public Attack getAttack2();
}
public class Abra extends AbstractPokemon
{
@Override
public Attack getAttack1()
{
return new Abra.PsyShock();
}
@Override
public Attack getAttack2()
{
return null;
}
@Override
public int getMaxHP()
{
return 30;
}
@Override
public String getName()
{
return "Base Set Abra";
} //etc...
Итак, мой вопрос: является ли какой-либо из этих методов предпочтительным или есть даже лучший способ?