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");
}
答案 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
开始我想重点是,超级课程可以尝试访问尚未初始化的课程(或者您以后在自己的课程中进行更改)