java - 在构造函数中泄漏它

标签 java memory-management observer-pattern observable

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

Netbeans 提供

Configure "passing suspicious parameters in the constructor" hint

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

最佳答案

当对象尚未完全构建时,您正在将 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关于安全对象构建。

关于java - 在构造函数中泄漏它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11662858/

相关文章:

Java二分查找

memory-management - 为什么析构函数会在 panic 发生时运行?

matlab - 位排序算法中存储管理的改进

java - Android - 在其他 Activity 中启动多个方法

java - 如何将线程分配给某种数据类型?

java - 将添加的字符串项保存到 ComboBox

java - 不同屏幕尺寸的android布局问题

java - 在公共(public)抽象方法的所有子类中提取公共(public)实现的最佳方法

PHP - 将字符串递归替换为数字需要很长时间

java - 使用通配符和类型化泛型会生成 "is not applicable for the arguments"错误