初始化很多字段 - 构造函数vs方法返回值

pg-*_*ban 1 java constructor field

我目前正在开发Java交易卡游戏,类似于旧的神奇宝贝游戏.我现在要做的是以某种方式定义所有卡片,但因为有很多字段需要初始化,我正在考虑其他方法,因为构造函数将非常长并且每张卡片都难以读取.我还必须初始化攻击,这意味着每次我必须基本上创建一个匿名内部类(这个术语是正确的吗?),如下所示:

/**
 * 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的第二个选择是使用接口和抽象类创建一个层次结构,这意味着值不会存储在字段中,而是在需要时由方法返回:

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...
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:这些方法中的任何一种都是首选,还是有更好的方法?

jqn*_*qno 5

我建议使用Builder模式.点击这里获取解释.

它由Josh Bloch推荐:它是有效Java第二版中的第2项.