You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对象引用声明为类字段而非局部函数变量的实践与术语咨询

问题解答

1. 对应的专属编程术语

这种把构造函数传入的对象引用赋值给类成员字段的操作,是构造函数依赖注入的标准实现环节,也可以通俗称之为「实例字段持有依赖引用」,本身是面向对象编程中的常规操作。

2. 是否属于不良实践?

本身不是不良实践,是全球Java开发者普遍使用的常规写法,你老师的用法完全匹配当前场景的需求:

  • 你对作用域的理解完全正确:只有存为类实例字段,才能在当前类的所有实例方法(比如后续你要实现的按钮点击回调actionPerformed方法)里访问到父窗口、表格模型这些对象。如果只在构造函数里存成局部变量,构造函数执行结束后局部变量就会被销毁,后续其他方法根本拿不到对应的引用。
  • 只有当你持有的引用只需要在构造函数内单次使用、不需要后续访问时,还强行存为类字段,才属于多余的不良实践,会造成不必要的内存占用,甚至增加内存泄漏的风险。

3. 示例代码可优化点

你老师给出的示例代码有一个小的不规范之处:parent、studModel、con这三个字段没有加访问修饰符,默认是包级访问权限,建议加上private修饰符提升类的封装性,更符合Java通用编码规范。

附:原始示例代码

public class UpdateStudentGUI extends JFrame implements ActionListener
{
    private int selectedRow;
    private JButton btnUpdate = new JButton("Update Student");
    private JPanel pnlButton = new JPanel();
    
    private JTextField txtStudID = new JTextField(10);
    private JTextField txtFirst = new JTextField(10);
    private JTextField txtLast = new JTextField(10);
    private JPanel pnlData = new JPanel(new GridLayout(3,2));
    
    TestStudentModel parent;
    StudentTableModel studModel;  
    
    Container con;
    
    public UpdateStudentGUI(TestStudentModel fe, StudentTableModel model, Student s)
    {
        this.setTitle("Update Student");
        this.setBounds(500, 350, 300, 150);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
        
        // ASSIGN PASSED ARGUMENT TO CLASS FIELD
        parent = fe;
        studModel = model;
        
        con = getContentPane();
        
        // add the GUI components
        pnlData.add(new JLabel("Student ID:"));
        pnlData.add(txtStudID);
        pnlData.add(new JLabel("Firstname:"));
        pnlData.add(txtFirst);
        pnlData.add(new JLabel("Lastname:"));
        pnlData.add(txtLast);
        
        con.add(pnlData, BorderLayout.CENTER);
        
        // add the button
        pnlButton.add(btnUpdate);
        con.add(pnlButton,BorderLayout.SOUTH );
        
        txtStudID.setText(Integer.toString(s.getStudID()));
        txtFirst.setText(s.getFirst());
        txtLast.setText(s.getLast());
    }
}

内容的提问来源于stack exchange,提问作者Matt Nguyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 14:45:09