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/