【发布时间】:2017-07-06 18:57:48
【问题描述】:
我一直在试图弄清楚如何使 ClassA 中的 List 可供 ClassB 访问 我尝试创建列表的实例/对象,但是当我获得列表的大小时它总是返回空(而在主类中它不是空的)。
示例:
A 类:
List<String> players = new ArrayList<String>();
如果我在这里使用players.size(),它将返回例如 2
在 ClassB 中,我尝试了以下方法:
ClassA classA = new ClassA();
List<String> newList = classA.players;
newList.size() 无论如何都会返回 0。
我也尝试过使用 getter,但这似乎没有什么不同。
示例:
A 类:
List<String> players = new ArrayList<String>();
public List<String> getList(){
return this.players;
}
B 类:
ClassA.getList().size()
这也将始终返回 0
我该如何正确地做到这一点?我尝试使用静态,这似乎有效,但有人告诉我:
“静态不是这项工作的正确工具。它是一种内存管理 工具,而不是访问修饰符。”
他告诉我:
您可以通过传递而不是静态而不是创建新实例 通过将实例作为参数添加到其他类 构造函数
但是我真的不明白他的意思。如果有人可以用一个例子来解释这一点,那就太棒了。提前致谢!
编辑:由于你们中的很多人都不太了解我想去的地方,所以我将发布我的来源: 在示例中称为 ClassA
public class TeamManager {
String prefix = new Messages().prefix;
List<String> players = new ArrayList<String>();
List<String> human = new ArrayList<String>();
List<String> infected = new ArrayList<String>();
void join(Player p){
if(!players.contains(p.getName())){
players.add(p.getName());
teleportToLobby(p);
for (String temp : players) {
Bukkit.getPlayer(temp).sendMessage("§e§l"+p.getName()+ " has joined infection. §7("+players.size()+"/16)");
}
}else{
p.sendMessage(prefix + "§cFailed. You are already in the game!");
}
}
void leave(Player p){
if(players.contains(p.getName())){
p.teleport(Bukkit.getWorlds().get(0).getSpawnLocation());
players.remove(p.getName());
for (String temp : players) {
Bukkit.getPlayer(temp).sendMessage("§7§l"+p.getName()+ " has left infection. §7("+players.size()+"/16)");
}
}else{
p.sendMessage(prefix + "§cYou are not in a game!");
}
}
void addToHumans(String playername){
human.add(playername);
}
void removeFromHumans(String playername){
human.remove(playername);
}
void addToInfected(String playername){
infected.add(playername);
}
void removeFromInfected(String playername){
infected.remove(playername);
}
void teleportToLobby(Player p){
Location lobby = getLocFromConfig("lobby");
if(lobby != null){
p.teleport(lobby);
p.sendMessage(prefix + "§aSuccessfully added to game!");
}else{
p.sendMessage(prefix + "§cLobby not set! Make sure to set a lobby using /infection setlobby");
}
}
void startGame(){
/*if(human.size() >= 4){
}*/
for (String temp : players) {
Bukkit.getPlayer(temp).sendMessage("Game will start shortly!");
}
}
Location getLocFromConfig(String locationName){
if(Main.plugin.getConfig().get("lobby") != null){
double x = Main.plugin.getConfig().getInt(locationName+".x");
double y = Main.plugin.getConfig().getInt(locationName+".y");
double z = Main.plugin.getConfig().getInt(locationName+".z");
World world = Main.plugin.getServer().getWorld(Main.plugin.getConfig().getString(locationName+".world"));
Location l = new Location(world, x, y, z);
return l;
}else{
Bukkit.getLogger().warning("[Infection] Lobby has not been set!");
return null;
}
}
int getPlayersInLobby(){
return players.size();
}
public List<String> getPlayers(){
List<String> players = this.players;
return players;
}
public List<String> getHumans(){
return human;
}
public List<String> getInfected(){
return infected;
}
}
事件类(在示例中称为 ClassB)
public class Events implements Listener{
TeamManager teamman = new TeamManager();
List<String> players = teamman.getPlayers();
List<String> humans = teamman.getHumans();
List<String> infected = teamman.getInfected();
@EventHandler
public void onPlayerJoin(PlayerJoinEvent e){
//Player p = (Player) e.getPlayer();
//e.setJoinMessage("["+lvl+"]" + e.getPlayer().getName() +"has joined the game!");
//p.setDisplayName("[lvl1]"+p.getName());
}
@EventHandler
public void onPlayerDamage(EntityDamageByEntityEvent e){
if(e.getEntity() instanceof Player){
Player p = (Player) e.getEntity();
Bukkit.getServer().broadcastMessage("Players: "+ players);
if(players.contains(p.getName())){
if((p.getHealth() - p.getLastDamage()) < 1){
for (String temp : players) {
Bukkit.getPlayer(temp).sendMessage("§c"+p.getName()+" got infected by "+p.getKiller().getName()+"!");
}
e.setCancelled(true);
p.setHealth(20);
teamman.addToInfected(p.getName());
teamman.removeFromHumans(p.getName());
p.sendMessage("§cYou have been infected!!");
}
}
}
}
}
如上所述,我希望能够从 TeamManager 访问列表并在事件中使用它们。正如所解释的,players 在 Events 类中是空的。我希望这会有所帮助。
【问题讨论】:
-
您的列表中没有任何玩家。您可以在构造函数中添加玩家,在创建列表时创建玩家,或者创建一个允许您将玩家添加到列表的方法。
-
@ThomasK 我知道如何添加到列表中,为了简单起见,我把它省略了。
-
如果
getList()不是静态的,你怎么能打电话给ClassA.getList().size()?一旦你将getList设为静态,你就必须将players设为静态。但仅当您想要一个独立于实例的列表时才将其设为静态。但是您需要独立于实例的列表这一事实告诉我,您的设计可以改进。 -
@svasa 如果我使用静态列表,它可以工作。但我被建议不要使用它。所以这就是为什么我要求一种不同的方法。
-
@DarkEyeDragon 另一种方法是将 A 类本身或列表传递给 B 类的构造函数,如下面的答案所示。