Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不使用setter的情况下更改私有字段成员_Java_Oop_Encapsulation - Fatal编程技术网

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

Java 在不使用setter的情况下更改私有字段成员,java,oop,encapsulation,Java,Oop,Encapsulation,在开发我最新的项目时,我发现了一些东西打破了我所理解的封装和可见性规则 在我的GUI类中,我为我的应用程序中的文本字段和按钮创建了几个类变量,并将它们全部设置为私有。我还为返回私有成员值的按钮和文本字段设置了getter。在我的SqlStatements类中,我引用getter,然后在getter上调用setText()方法,它更改私有成员字段的值。这怎么可能 例如: public class InitGUI { public static JTextField getfNameFiel

在开发我最新的项目时,我发现了一些东西打破了我所理解的封装和可见性规则

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

例如:

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("");
}
公共类InitGUI{

public static JTextField getfNameField(){将不变性与可见性混为一谈。通过为私有字段提供getter(破坏封装),可以将其方法公开给外部世界(可能是一些更改字段内部状态的方法,以及由此导致的类)

这如何能够更改私有成员的值

它没有改变
fName
私有字段的值-它仍然是对同一
JTextField
的引用。您所做的只是在该
JTextField
对象上调用一个方法

getter和setter的目的是提供限制/禁用 对私有变量进行不必要的修改


如果这对您没有用处,则无需将它们定义为私有

您的问题在于您对私有如何工作的假设是不正确的,因此,您的代码暴露了太多。而不是

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("");
}
这将限制组件的曝光,仅限于您所需的曝光


同样,请避免不必要地使用static。

您对java中成员的工作方式感到困惑。私有成员一开始确实是私有的。当您通过getter方法授予该成员访问权限时,它确实可以被“修改”。getter返回存储在该成员中的
类的实例。无论您对此做什么实例影响私有变量,因为它们都是相同的实例

但是,它不会返回此成员存储的
内存地址

JTextField field = InitGUI.getmNameField();
field = new JTextField(); // this can't affect the original.

这篇文章可能有助于解释java引用的值性质。

您可以为JTextField的特定字段提供公共getter,而不是整个对象的getter。这样您就可以避免有人设置字段

e、 g


通过方法授予对私有成员的访问权并不能使其保持私有。如果这有意义的话。我认为,在私有成员上使用getter和/或setter之外,它不能从类之外被触及。访问修饰符不控制访问,如果你想通过反射,总是可以访问类之外的私有成员。不是吗虽然我意识到情况并非如此,但您可能也不知道。那么,如果您可以对字段成员执行直接操作,那么在字段成员上使用private的目的是什么呢?Keith,如果您设计一个不可变类并将其用作私有字段,并且为此提供getter,那么您就不能“执行直接操作”我认为,如果不为私有文本字段提供setter方法,它们将无法从类外修改。@Keith:re,
“我认为…”
--我们都会犯错误,现在你知道得更清楚了。更好的办法是给你的类一个
public void setFNameText(String text)
方法和
getFNameText()
,防止直接暴露于Swing组件。我想我理解你的意思。通过这样做,我暴露了TextField对象,并且没有真正更改私有成员字段中的值?@Keith setter用于替换当前引用(实例)但是如果你提供了一个getter,并且实际的类不是不可变的,你可以改变这个对象的内部状态(但是是的,你不能用另一个来替换它)。我知道现在每个人都在谈论什么了。我应该像这个公共字符串getfNameField()一样调用它。{return fname.getText();}这样我就不会暴露整个textfield对象。你能解释一下为什么在这种情况下使用静态方法是不好的吗?我应该只是尝试将对象作为参数传递吗?@Keith:使用静态打破了面向对象的范例,因为你不再处理实例,而是处理类。你的代码变得更难升级NDDEBUG,您不能在其上使用单元测试。以静态方式使用面向对象的语言是没有意义的,因为这样做会浪费语言80%以上的功能。
JTextField field = InitGUI.getmNameField();
field = new JTextField(); // this can't affect the original.
public String getFname(){
return fName.getXXXX();
}