如何解决Java-非静态类的扩展静态类
| 我有一类“字符”,字符是非静态的。我希望我的玩家班级可以扩展角色,但也可以是静态的。 我基本上希望所有其他对象和类都能够访问播放器,而不必创建和传递播放器实例。 为什么做到这一点最好?解决方法
我能想到的唯一好方法实际上不是扩展而是包装器:
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(); }
}
或者,实际上,由于您的目标只是确保有一个播放器对象,因此您可以忘记将方法设为静态,而将构造函数隐藏起来:
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()
,并且它始终为您提供相同的对象(您创建的对象绝不超过一个)。
, 确实好像您只想要一个全局变量。这通常通过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%的时间都倾向于依赖注入而不是全局状态。当某个方法需要访问播放器时,请将其传递。这将使您更加轻松地测试代码,并使代码更有利于更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。