加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如果在获取参数的类之后实例化它,如何使用对象引用作为参数?

发布时间:2020-12-15 08:43:29 所属栏目:Java 来源:网络整理
导读:所以我有这个代码: 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 c
所以我有这个代码:

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());
    }

}

我的问题是,类Gui以玩家为参数而玩家以Gui为参数.我如何让两个对象互相作为参数?如果我的代码效率低下,请随时告诉我.

解决方法

好吧,理想情况下你应该尝试打破循环依赖,否则,你可以:

>创建GUI,通过传入GUI创建玩家,然后将玩家添加到GUI
>创建玩家,通过传入玩家创建GUI,然后为玩家设置GUI
>在播放器构造函数中创建GUI:

Player(String name)
{
    GUI gui = new GUi(this);
    ...
}

所有这些都是不理想的:

>你可能希望你的类是不可变的,这使前两个选项变得讨厌
>在构造函数执行完毕之前发布此引用在线程安全性和内存模型方面存在各种问题,并且可能允许GUI构造函数在完全初始化之前回调到Player对象.

这可以追溯到“试图打破依赖” – 但如果这真的不可能,我可能会赞成第一种选择,而不知道其他任何事情.能够将玩家添加到游戏中是有意义的 – 在IMO之后为玩家设置GUI没有多大意义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读