在构造函数中泄漏这个

时间:2012-07-26 05:23:39

标签: java memory-management observer-pattern observable

Controller类是一个单例,这似乎是一个特殊情况,允许安全地将this传递给Controller

Netbeans给出

  

配置“在构造函数中传递可疑参数”提示

controller.addObserver(this);让我问最好的技术是什么,虽然我是gather it's not a good approach

package net.bounceme.dur.usenet.swing;

import java.util.Observable;
import java.util.Observer;
import java.util.logging.Logger;
import javax.mail.Folder;
import javax.swing.ListModel;
import net.bounceme.dur.usenet.controller.Controller;
import net.bounceme.dur.usenet.controller.MessageBean;
import net.bounceme.dur.usenet.controller.MessagesDefaultListModel;

public class MessageSelect extends javax.swing.JPanel implements Observer {

    private static final Logger LOG = Logger.getLogger(MessageSelect.class.getName());
    private Controller controller = Controller.getInstance();
    private ListModel messages = new MessagesDefaultListModel();
    private MessageBean messageBean = new MessageBean();

    @SuppressWarnings("unchecked")
    public MessageSelect() {
        controller.addObserver(this);
        initComponents();
        messagesJList.setPrototypeCellValue("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
    }

2 个答案:

答案 0 :(得分:7)

当对象尚未完全构建时,您正在将this传递给外部类(Controller)。然后,Controller可以在构造尚未完成时引用您的对象。

大多数人通过使用首先创建对象的工厂方法解决此问题,然后从外部传递this

// private to force clients to use the static factory method
private MessageSelect() {
  initComponents();
  messagesJList.setPrototypeCellValue("xxx");
}

public static MessageSelect createInstance() {
  MessageSelect instance = new MessageSelect();
  instance.controller.addObserver(instance);
  return instance;
}

查看安全对象构建的this excellent Brian Goetz article

答案 1 :(得分:1)

  

在构造函数中使用this作为参数可能很危险,因为对象未完全初始化

http://wiki.netbeans.org/Java_Hints

开始

我想重点是,超级课程可以尝试访问尚未初始化的课程(或者您以后在自己的课程中进行更改)