[英]Java: Why can't I declare the reference-variable in one statement and create the referenced object in another statement of the class?
[英]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.