在Java中,我可以引用另一个类中的对象吗?

时间:2014-08-10 18:35:54

标签: java oop

我有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!");
            }

由于

2 个答案:

答案 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类。