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

Java—非静态类的扩展静态类,java,class,object,static,Java,Class,Object,Static,我有一类‘性格’,性格是非静态的。我希望我的玩家类可以扩展角色,但也可以是静态的 我基本上希望所有其他对象和类能够访问player,而无需创建和传递player实例 实现这一点的最佳原因是什么?我能想到的唯一好方法实际上不是扩展,而是包装: class Player { private final static Charachter me = new Character(); public static doSomething(){ me.doSomething(); } }

我有一类‘性格’,性格是非静态的。我希望我的玩家类可以扩展角色,但也可以是静态的

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


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

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

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

    public static doSomething(){ me.doSomething(); }
}
当然,您也可以扩展和包装:

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(); }
}
或者,实际上,由于您的目标只是保证存在单个玩家对象,您可以忘记将方法设置为静态,但隐藏构造函数:


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

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

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

    public static doSomething(){ me.doSomething(); }
}
当然,您也可以扩展和包装:

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(); }
}
或者,实际上,由于您的目标只是保证存在单个玩家对象,您可以忘记将方法设置为静态,但隐藏构造函数:


这确保了获取
播放器的唯一方法是调用
播放器.getPlayer()
,并且它总是给您相同的对象(您永远不会创建多个对象)。

实际上,您似乎只需要一个全局变量。这通常通过单例模式实现:

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

    private Player() {
    }

    public static Player getHuman() {
        return humanPlayer;
    }

    //...
}

//...
Player.getHuman().move(2);
播放器中的这些方法应该很少需要是静态的。你为了一点点的便利而牺牲了好的设计(不管怎样,这以后可能会咬到你)


就我个人而言,95%的时间里,我倾向于依赖注入而不是全球政府。当一个方法需要访问播放器时,将其传入。这将使您可以更轻松地测试代码,并使代码更有利于更改。

实际上,您似乎只需要一个全局变量。这通常通过单例模式实现:

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

    private Player() {
    }

    public static Player getHuman() {
        return humanPlayer;
    }

    //...
}

//...
Player.getHuman().move(2);
播放器中的这些方法应该很少需要是静态的。你为了一点点的便利而牺牲了好的设计(不管怎样,这以后可能会咬到你)



就我个人而言,95%的时间里,我倾向于依赖注入而不是全球政府。当一个方法需要访问播放器时,将其传入。这将使您能够更轻松地测试代码,并使您的代码更有利于更改。

将您的类命名为java.lang.Character类是个坏主意非常正确,我正在将其缩小到包中,但我认为我可能会更改它。您确定在处理类时理解“静态”的含义吗?顶级类不能声明为静态的,也不能声明为非静态的。正确的,我的意思是,我的角色中有非静态的方法,我需要在Player中是静态的。听起来你目前的方法是错误的,但是,如果没有更多关于实际目标是什么的信息,我不确定我们是否可以推荐更好的方法。用java.lang.Character类的名称命名你的类是个坏主意非常正确,我正在将其缩小到包的范围,但我想我可能会更改它。你确定在处理类时理解“静态”的含义吗?顶级类不能声明为静态的,也不能声明为非静态的。正确的,我的意思是,我的角色中有非静态的方法,我需要在Player中是静态的。听起来你目前的方法是错误的,但如果没有更多关于实际目标的信息,我不确定我们是否可以推荐更好的方法。在商业领域,我们称之为“有利于组合而非继承”嘿,我学了一个新学期。还添加了一个非合成解决方案…a我没有读马克·彼得斯的解决方案,但第三个选项几乎是它的副本。好的,新的解决方案看起来是最好的。我从来没有想过要那样做。谢谢在商业上,我们称之为“偏好组合而非继承”嘿,我学了一个新学期。还添加了一个非合成解决方案…a我没有读马克·彼得斯的解决方案,但第三个选项几乎是它的副本。好的,新的解决方案看起来是最好的。我从来没有想过要那样做。谢谢那么需要访问player的类/对象呢。比如我的GUI需要访问它,那么我真的应该传递它吗?@Paramount这是件好事——你不需要传递它,他们可以通过
player.getHuman()
获取player对象,好吧,我想我现在理解了@trutheality。感谢关于需要访问player的类/对象的内容。比如我的GUI需要访问它,那么我真的应该传递它吗?@Paramount这是件好事——你不需要传递它,他们可以通过
player.getHuman()
获取player对象,好吧,我想我现在理解了@trutheality。谢谢