封装 - 为什么我使用 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 被创建的原因。
我只想问,我们有一个 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 被创建的原因。