簡體   English   中英

在Java中,我可以引用在另一個類中的一個類中創建的對象嗎?

[英]In Java can I reference an object made in one class in another?

我有3節課:

  • 主要
  • 命令
  • 球隊

Main內部,我正在創建一個使用Team內部方法的對象:

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

是否可以在不重新創建對象的情況下將其包含在Commands中 還是可以重新創建它?

在命令內部調用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不是一個靜態概念,而是一個實例概念:

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);

(這樣做的另一個重要好處是,您可以在單元測試中模擬工廠方法,並且總的來說,您會發現實例邏輯比靜態邏輯更容易進行單元測試。)

如果您的命令依賴於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 humanTeam = new Team("Humans");
Team monsterTeam = new Team("Monsters");

只需將對象設置為Commands類屬性即可

Commands commands = new Commands();
commands.setHumanTeam(humanTeam);
commands.setMonsterTeam (monsterTeam );

現在,您可以使用它們來操作Commands類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM