gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:39:41 25 4
gpt4 key购买 nike

我有 3 节课:

  • 主要
  • 命令
  • 团队

Main内部,我正在创建一个使用Team内部方法的对象:

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

谢谢

最佳答案

乍一看,人们可能会建议将 addPlayer 设置为静态方法,但这在这种情况下可能不是理想的设计。因为团队不是一个静态概念,而是一个实例概念:

Team humanTeam = new Team("Humans");
Team monsterTeam = new Team("Monsters");

您拥有团队的两个特定实例,而不是团队的一个通用概念。因此,您需要将玩家添加到 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);

(这样做的另一个重要好处是,您可以在单元测试中模拟工厂方法,并且您通常会发现实例逻辑比静态逻辑更容易进行单元测试。)

关于java - 在Java中,我可以在另一个类中引用一个类中创建的对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25231792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com