【发布时间】:2020-02-05 17:14:11
【问题描述】:
我正在制作一个简单的播放器/会话系统,但我发现了一个逻辑错误,即使在我看来一切正常。
让我描述一下我的想法,我还在学习 OOP 的工作原理,这就是我在这个项目中练习的原因:
- 首先我创建了两个类:
- 类玩家
- 班级会议
在 Session 的类中,我有一个名为 joinSession(Session s); 的方法。 这个方法会让玩家的对象像这样加入会话:
Session s1 = new Session();
Player p1 = new Player(name : "Jack");
p1.joinSession(s1);
问题是在 Session 属性中我有一个:
public Player firstPlayerToJoin;
public Player lastPlayerToJoin;
每当我让玩家加入会话时,一切似乎都很好,Jack 是 firstPlayerToJoin 和 lastPlayerToJoin。但真正的问题是当其他玩家决定加入时:
Player p2 = new Player("Rose");
p2.joinSession(s1);
Rose 将再次成为 firstPlayerToJoin 和 lastPlayerToJoin,而不仅仅是 lastPlayerToJoin。
这是我的代码:
第一个玩家类
private static int id;
private Session session;
boolean isOnSession = false;
public static String name;
public static void say(String message){
System.out.println(name + " says " + message);
}
// Player join session
public void joinSession(Session s){
this.session = s;
System.out.println(name + " joined the session : " + this.session.sessionName );
System.out.println("Players ONLINE = " + s.playersOnline);
if( s.playersOnline == 0){
s.firstPlayerToJoin = this;
s.lastPlayerToJoin = this;
} else {
s.lastPlayerToJoin = this;}
s.playersOnline++;
}
public void quitSession(){
this.session = null;
isOnSession = false;
System.out.println(name + " left his session.");
}
Player(String name){
id = id++;
this.name = name;
}
public static void showPlayerInfo(Player n){
System.out.println("========== Player INFO ==========");
System.out.println("ID : " + id + "\nName : " + name );
}
}
这里是 Session 类:
public class Session {
int id = 0;
int maxConnected = 10;
public int playersOnline = 0;
String[] playersConnected = new String[maxConnected];
public String sessionName;
public Player firstPlayerToJoin;
public Player lastPlayerToJoin;
Session(){
this.id=id++;
this.sessionName = "SESSION"+id;
}
public void sessionInfo(){
System.out.println("======== Session INFO ========");
System.out.println("Session name : " + sessionName);
System.out.println("Players online : " + playersOnline);
System.out.println("First player to join : " + firstPlayerToJoin.name);
System.out.println("Last player to join : " + lastPlayerToJoin.name);
System.out.println("==============================");
}
int getPlayersOnline(){
return this.playersOnline;
}
}
最后是主类和方法:
public class Main {
public static void main(String[] args) {
Player p1 = new Player("Omar");
Session s1 = new Session();
p1.joinSession(s1);
s1.sessionInfo();
Player p2 = new Player("Rick");
p2.joinSession(s1);
s1.sessionInfo();
}
}
如果对这个想法有任何疑问或困惑,请告诉我。
实际输出:
Omar joined the session : SESSION0
Players ONLINE = 0
======== Session INFO ========
Session name : SESSION0
Players online : 1
First player to join : Omar
Last player to join : Omar
==============================
Rick joined the session : SESSION0
Players ONLINE = 1
======== Session INFO ========
Session name : SESSION0
Players online : 2
First player to join : Rick
Last player to join : Rick
==============================
在最后一行之前的行中,我们可以看到:第一个加入的玩家:Rick 玩家的对象 p1 会覆盖该属性,即使条件不成立。
【问题讨论】:
-
name字段为static。删除static。 -
如果您有调试器,您可以启动调试会话并尝试一下;)。通过调试可以学到很多东西。