Eri*_*len 3 java constructor arguments class object
所以我有这个代码:
package com.erikbalen.game.rpg;
import com.erikbalen.platform.*;
import javax.swing.JFrame;
public class World extends Engine {
public static void main(String[] args) {
Gui display = new Gui(/*takes a Player argument so i can get certain variables*/);
display.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
display.setSize(300,220);
display.setVisible(true);
Player player1 = new Dps("ebalen", display);
Player player2 = new Healer("frankypanky", display);
}
}
package com.erikbalen.game.rpg;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Gui extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = -384241835772507459L;
private JLabel playerInfo;
private JTextField textField;
private final static String newline = "\n";
private JTextArea feed;
private JScrollPane scrollPane;
private Player player;
public Gui(Player currentPlayer) {
super("Erik's RPG");
this.player = currentPlayer;
setLayout(new FlowLayout());
playerInfo = new JLabel("<html>Health = " + currentPlayer.getHealth() + " | " + "Mana = " + currentPlayer.getMana() + "</html>");
playerInfo.setBorder(BorderFactory.createTitledBorder(currentPlayer.getName()));
textField = new JTextField(20);
textField.addActionListener(this);
feed = new JTextArea(5, 20);
scrollPane = new JScrollPane(feed);
feed.setEditable(false);
add(playerInfo);
add(feed);
add(textField);
add(scrollPane);
}
public void actionPerformed(ActionEvent textBox) {
String text = textField.getText();
this.player.chat(text);
}
public void printText(String text) {
feed.append(text + "\n");
feed.setCaretPosition(feed.getDocument().getLength());
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,类Gui以玩家为参数而玩家以Gui为参数.我如何让两个对象互相作为参数?如果我的代码效率低下,请随时告诉我.
好吧,理想情况下你应该尝试打破循环依赖,否则,你可以:
在播放器构造函数中创建GUI:
Player(String name)
{
GUI gui = new GUi(this);
...
}
Run Code Online (Sandbox Code Playgroud)所有这些都是不理想的:
this在构造函数执行完毕之前发布引用在线程安全性和内存模型方面存在各种问题,并且可能允许GUI构造Player函数在完全初始化之前回调该对象.这可以追溯到"试图打破依赖" - 但如果这真的不可能,我可能会赞成第一种选择,而不知道其他任何事情.能够将玩家添加到游戏中是有意义的 - 在IMO之后为玩家设置GUI没有多大意义.