封装 - 为什么我使用 getter setter 让我的数据成员 public 如果我已经在 class 中声明它们是私有的

Encapsulation - Why I am using getter setter to make my data members public if I already declare them private in class

我只想问,我们有一个 class,其中有两个私有数据成员说:

class Employee{
private int empid;
private String empname;

}

我将它们声明为私有,这意味着我只能在 Employee class 中使用它们。那么需要为数据成员创建 getter setter 并使它们成为 public.

希望你能解决我的问题。

这是一个很好的问题。您经常会看到代码示例将成员设为私有,但通过 getter/setter 对公开它们,getter/setter 除了设置相应的成员外没有做任何其他事情。

在我的书中,这根本不是封装。你只不过是让成员成为 public。尽管很多人不愿意这样做,但他们很乐意为所有成员自动提供访问器。

提供访问器的一个原因是能够进行输入验证。例如。如果您 empId 有一个 checksum,您可以在 setter 中强制执行它。直接访问会员是不可能的。

在我看来,最好考虑一下这个对象将扮演的角色,看看它如何用最少的访问器来实现这个角色。否则你的代码可能会违反 Law of Demeter.

你是绝对正确的,创建 setter/getter 或使字段 public 都以相同的方式违反封装,因此如果你确实想封装你的私有字段,大概是因为你是在面向对象的环境中工作,您不想使用这些东西。

关于为什么需要创建 setter/getters 的问题:大多数项目(有意或无意地)并不将其设计基于面向对象。还有其他范例,其中数据和功能是分离的,因此封装起的作用很小。

在 Java 世界中,拥有纯(或非常接近纯)数据结构(Bean)是很常见的,并且 Services/Components/EJBs/etc 在这些 Bean 上工作(基本上可以访问所有字段).通常,这些架构将功能部分进一步拆分为演示、业务、持久性(3 层架构)等主题,或创建可访问所有相关字段的显式控制过程(如 MVC 通常是如何完成的)。

一种方法是否优于另一种方法可能是一个主观的讨论,但简短的回答是:通常是不同的范例(不是 OO),这就是 setters/getters 被创建的原因。