我有3个班级:
在主要内部我正在创建一个使用团队内部方法的对象:
Team humanTeam = new Team("Humans");
Team monsterTeam = new Team("Monsters");
是否可以在命令中包含该内容而无需重新创建对象?或者是否可以重新创建它?
在命令中调用humanTeam的示例:
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
Player p = (Player)sender;
if(label.equalsIgnoreCase("joinhuman")){
Team.addPlayer(humanTeam, p); //This line.
p.sendMessage("You just joined the human team!");
}
由于
答案 0 :(得分:1)
快速浏览一下,可能会建议将addPlayer
作为静态方法,但在这种情况下,这可能不是理想的设计。因为Team
不是静态概念,而是实例概念:
Team humanTeam = new Team("Humans");
Team monsterTeam = new Team("Monsters");
您有Team
的两个特定实例,而不是Team
的一个通用概念。因此,您希望将播放器添加到Team
的实例,而不是Team
的概念。它实际上只是语义,但我认为可以更清晰地实现将实例概念与静态概念分离。
所以你可能想做的事情(看似是Minecraft Bukkit插件)会以某种有意义的方式跟踪你的Team
实例,以便插件中的各种事件和对象可以访问这些存储的实例。数据库可能是最好的,特别是如果你想在游戏重新启动之间坚持团队的概念。如果这不是必需的,那么您可以使用Team
的实例并静态存储它们。鉴于上面的硬编码行,你可以像Team
类每天对它们进行硬编码似乎是合理的:
class Team {
private static humanTeam;
private static monsterTeam;
// initialize them inline or in the static initializer
public static Team getHumanTeam {
return humanTeam;
}
public static Team getMonsterTeam {
return monsterTeam;
}
// etc.
}
你可以参考这些"得到"在这种情况下的方法是"工厂方法"为你的团队。如果你随着时间的推移增加更多种类的团队,那么你可能会建立一个更通用的工厂"它接受某种团队标识符(例如团队名称的字符串)。这些团队也可能存储为团队名称和实例的字典。最终,您在此设置中所做的是保持"团队"封装到Team
类。随着整体逻辑的增长,您可以通过提取TeamMeneger
类来进一步分离关注点,以保持管理团队的逻辑。
现在游戏中的任何类都可以静态引用这些特定实例:
Team.getHumanTeam().addPlayer(p);
(这样做的另一个重要好处是你可以在单元测试中模拟工厂方法,并且你会发现实例逻辑比静态逻辑更容易进行单元测试。)
答案 1 :(得分:0)
如果你的命令依赖于Team类,你可以这样做。
public class Commands{
private Team humanTeam;
private Team monsterTeam;
public Team getHumanTeam() {
return humanTeam;
}
public void setHumanTeam(Team humanTeam) {
this.humanTeam = humanTeam;
}
public Team getMonsterTeam() {
return monsterTeam;
}
public void setMonsterTeam(Team monsterTeam) {
this.monsterTeam = monsterTeam;
}
}
现在,当你像这样创建Team对象时
Team humanTeam = new Team("Humans");
Team monsterTeam = new Team("Monsters");
只需将Objects设置为Commands类属性,就像这样
Commands commands = new Commands();
commands.setHumanTeam(humanTeam);
commands.setMonsterTeam (monsterTeam );
现在您可以使用它们来操作Commands类。