Java - 非静态类的扩展静态类

时间:2011-06-12 04:45:50

标签: java class object static

我有一类'字符',字符是非静态的。我希望我的播放器类扩展角色,但也是静态的。

我基本上希望所有其他对象和类能够访问播放器而无需创建和传递播放器实例。

实现这一目标的最佳原因是什么?

2 个答案:

答案 0 :(得分:3)

我能想到的唯一好方法实际上不是扩展,而是包装器:

class Player {
    private final static Charachter me = new Character();

    public static doSomething(){ me.doSomething(); }
}

当然你也可以扩展AND wrap:

class Player extends Character {

    private final static Player me = new Player();

    // if you don't want anyone creating player objects
    // make the constructor private:
    private Player(){ super(); }

    public void doSomething(){
        // stuff
    }

    public static void staticDoSomething(){ me.doSomething(); }
}

或者,实际上,由于您的目标只是为了保证单个玩家对象,您可以忘记将方法设为静态,但隐藏构造函数:

class Player extends Character {

    private static Player thePlayer = null;

    public static Player getPlayer(){
        if( thePlayer == null ){
            // Create the player
            thePlayer = new Player();
        }
        // There is a valid player object, so return it.
        return thePlayer;
    }

    // hide the constructor(s) by making them private:

    private Player(){ super(); }
}

这确保获得Player的唯一方法是调用Player.getPlayer(),并且它总是为您提供相同的对象(您永远不会创建多个对象)。

答案 1 :(得分:2)

真的,你似乎只想要一个全局变量。这通常通过Singleton模式实现:

public class Player extends Character {
    private static final Player humanPlayer = new Player();

    private Player() {
    }

    public static Player getHuman() {
        return humanPlayer;
    }

    //...
}

//...
Player.getHuman().move(2);

Player中的这些方法应该很少是静态的。你为了一点点便利而牺牲了良好的设计(无论如何,这可能会让你感到害怕)。

就个人而言,我倾向于依赖注射超过全球状态约95%的时间。当一个方法需要访问该播放器时,请将其传入。这样可以让您更轻松地测试代码,并使您的代码更有利于更改。