与Java Encapsulation Concept混淆

new*_*bie 4 java encapsulation getter-setter

美好的一天!

我正在阅读一本关于封装的Java书,它提到了getter和setter方法.

我已经读过要隐藏属性,我必须将我的实例变量标记为"PRIVATE"并使用"PUBLIC"方法getter and setter来访问数据.所以我尝试制作一个类似但不是传统的代码,如下所示:

public class AddressBookEntry {

    private String name;
    private String address;
    private String telNo;
    private String email;

    public void getAllInfo() {
        name = JOptionPane.showInputDialog("Enter Name: ");
        address = JOptionPane.showInputDialog("Enter Address: ");
        telNo = JOptionPane.showInputDialog("Enter Tel. No: ");
        email = JOptionPane.showInputDialog("Enter Email Address: ");
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码是否暴露了我的变量,因为我直接分配了它?我怎么能做得更好?如果我getter and setter改为使用传统方法并将值分配给其他类,会不会更好?"隐藏数据"是什么意思?

谢谢.

kgi*_*kis 7

您可以使用setter和getter使变量可以从类外部访问.在你的例子中,你将拥有

public class AddressBookEntry {

    private String name;

    public void setName(String name) {
       this.name = name;
    }

    public String getName() {
       return name;
    }
}
Run Code Online (Sandbox Code Playgroud)

您将从UI类访问name属性(在同一个类中混合UI和业务逻辑并不好):

public class MyPane extends JFrame {

  public getAllData() {
     String name = JOptionPane.showInputDialog("Enter Name: ");
     AddressBookEntry entry = new AddressBookEntry();
     entry.setName(name);
     // You can't use entry.name = name
  }

}
Run Code Online (Sandbox Code Playgroud)


Mac*_*Mac 5

是的,不是.封装的关键是它可以防止其他类需要知道你的类在幕后做了什么.如果您存储name在一个String(如你在这里所做的),读/从它写入文件,或做不同的事情,封装的一点是,你的类的用户也不要紧,因为所有他们看到的是String getName( )void setName (String name).

由于数据的修改完全在您的类的控制之下,因此它不会破坏封装.如果你确实存储name到文件,那么你可能会这样做,getAllInfo而没有任何其他类的用户更聪明.由于来自类外部的可观察行为仍然隐藏了类的内部正在做什么,它仍然被封装.

也就是说,这是一种非常规的方法.就像我在第一段中描述的那样,使用访问器方法(getter和setter)是一种更惯用的方法,对于使用您的代码的其他人来说更容易理解.你可以做你做的事情,它不会破坏封装,但它不是我称之为优雅或典型的东西.