【问题标题】:Leaking this in constructor在构造函数中泄漏这个
【发布时间】:2012-07-24 15:49:44
【问题描述】:

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

【问题讨论】:

    标签: java memory-management observer-pattern observable


    【解决方案1】:

    当对象尚未完全构造时,您将 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 的安全对象构造。

    【讨论】:

      【解决方案2】:

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

      来自http://wiki.netbeans.org/Java_Hints

      我想重点是,超类可能会尝试访问尚未初始化的类的一部分(或者您稍后在自己的构建过程中进行更改)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-20
        • 2021-06-17
        • 2013-01-12
        • 1970-01-01
        • 1970-01-01
        • 2019-08-19
        相关资源
        最近更新 更多