对象引用声明为类字段而非局部函数变量的实践与术语咨询
问题解答
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
相关产品推荐
相关产品推荐

