在不使用setter的情况下更改私有字段成员

Kei*_*ith 0 java oop encapsulation

在开发我最近的项目时,我发现了一些破坏封装和可见性规则的东西,因为我理解它们.

在我的GUI类中,我为我的应用程序中的文本字段和按钮创建了几个类变量,并将它们全部设置为私有.我还为按钮和文本字段设置了getters,返回私有成员的值.在我的SqlStatements课程中,我引用getter,然后setText()在getter上调用方法,它会更改私有成员字段的值.这怎么可能?

例如:

public class InitGUI {
    public static JTextField getfNameField() {     <---- getter for JTextField
        return fName;
    }

    private static JTextField fName;   <---- JTextField variable.
}

public class SqlStatements {
    // how is this able to change the value of a private member?
    InitGUI.getmNameField().setText("");
}
Run Code Online (Sandbox Code Playgroud)

gyo*_*ham 11

你将不可变性与可见性混为一谈.通过为私有字段提供getter(打破封装),您可以将它的方法暴露给外部世界.(可能是一些改变字段内部状态的方法 - 以及你的类的结果).

  • @Keith:重新说,"我以为......"` - 我们都犯错误,现在你知道的更好了.更好的方法是给你的类一个`public void setFNameText(String text)`方法和`getFNameText()`,它可以防止直接暴露在Swing组件中. (2认同)
  • 我看到现在每个人都在谈论什么.我应该像这个公共字符串getfNameField(){return fname.getText();}那样调用它.这样我就不会暴露整个文本字段对象. (2认同)