【问题标题】:Arraylist inside instance is not private实例内的 Arraylist 不是私有的
【发布时间】:2019-02-04 01:21:35
【问题描述】:

当我创建一个实例时,我在该实例中创建了一个 ArrayList,并获得了该实例的指针,但是当我向该 ArrayList 添加项目时,它并没有将其添加到其中,而是添加到有点像“公共”列表... 找到匹配后,它会在匹配中获取 2 个玩家的 SocketChannel id 并将它们添加到创建的房间(至少应该如此),但它没有......

这就是我在房间类中创建 ArrayList 的方式:

private static ArrayList<SocketChannel> room_players = new ArrayList<SocketChannel>();

这是在匹配中找到 2 个玩家时的代码:

room Room = new room(); //
System.out.println("Making a new room");
ArrayList<SocketChannel> player_list = Room.getPlayerList();
SocketChannel s1 = matchmakingPlayers.get(i);
SocketChannel s2 = matchmakingPlayers.get(i-1);
_main.rooms.add(Room);
player_list.add(s1);
player_list.add(s2);

这是我连接了 2 个客户端时的输出:

2 Players were found
Making a new room
Number of players in room: 2

但是当我已经有 2 名玩家在游戏中并且我想匹配新 2 时的输出是:

2 Players were found
Making a new room
Number of players in room: 4

非常感谢您的任何帮助或建议!

【问题讨论】:

  • private 在 Java 中意味着(粗略地说)“类及其嵌套类的私有”。这并不意味着“私有到单个实例”。因此,即使您删除了static,在某些情况下,另一个实例中的方法调用仍然可以看到和修改private 变量。
  • room Room = new room();???你的外壳被翻转了。 Java命名约定是类名以大写字母开头,变量名以小写字母开头,所以应该是Room room = new Room();
  • 另外我建议你编程到接口并使用List&lt;T&gt; list = new ArrayList&lt;&gt;();而不是ArrayList&lt;T&gt; list = new ArrayList&lt;&gt;();

标签: java class arraylist


【解决方案1】:

由于room_players 是一个静态成员,它被类的所有实例共享。删除 static 修饰符将为每个 Room 实例提供该变量自己的单独实例。

private final List<SocketChannel> room_players = new ArrayList<>();

【讨论】:

  • 非常感谢!但是我现在如何从其他类访问它?
  • 使用getter方法。
  • @BMatjasic 您可以将其设为单例类,然后为该属性创建一个 getter。
【解决方案2】:

但是我现在如何从其他类访问它?

有不同的方法: 您可以将成员从私有更改为公共...

public final List<SocketChannel> room_players = new ArrayList<>();

您可以创建一个公共方法来获取值...

public List<SocketChannel> getRoom_players() {
    return room_players;
}

您也可以将类设为 Singleton。如果您只想让该类的一个实例在应用程序中的任何位置共享和访问。也许在你的情况下这没有意义。信息:https://www.journaldev.com/1377/java-singleton-design-pattern-best-practices-examples

【讨论】:

  • 嗯,但是当我尝试获取实际列表时遇到问题: ArrayList p_list = getPlayerList();我需要将 room_players 更改为静态...
  • 也许您正试图从静态上下文中访问 room_players,您能否发布更多代码以便我们了解全局?
猜你喜欢
  • 2011-10-22
  • 1970-01-01
  • 2012-07-03
  • 2021-01-20
  • 1970-01-01
  • 2013-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多