用getter和setter不是public的方法能在Java中实现封装吗?
Can encapsulation be achieved in Java with getter and setter methods that are not public?
据我了解,封装(在 Java 中)是以某种方式将相关数据和方法包装到对象中的机制,数据对其他 class 隐藏es并且只能通过当前class的方法访问(a.k.a。数据隐藏),如果我错了请纠正我。
在阅读一些教程时,我看到他们指定 getter 和 setter 方法应该是 public。
我知道为什么它不应该是私有的,但为什么不保护或默认?使用受保护或默认的 getter 和 setter 方法是否仍算作封装?
当然可以保护访问者。例如,抽象基础 class 可能会通过使用受保护的 getter 向子 class 公开一些内部状态,而该 getter 不是消费者应该使用的 API 的一部分使用。
也就是说,getters 和 setter 通常在 JavaBeans 的上下文中使用,其中 getters 和 setter define对象的属性。如果它们 public 不可见,那么虽然它们仍然提供封装,但它们不满足特定目的。
您正在阅读的教程是从某个对象的用户(即开发人员)的角度编写的。这些属性需要 public 才能完成它们的工作,大多数 属性 访问器是 public.
封装是为了防止其他对象直接修改值。
如果您将 getter 和 setter 设为私有,则只有 class 中的其他方法才能调用它们。这可能是因为您想验证该值,或者因为您想确保支持多线程或其他一些问题。
如果你让它们受到保护,那么继承和扩展 classes 将能够调用它们,没有其他 classes,甚至你的 main
方法也不能调用 getter 和 setter.
如果您只想公开值,没有什么能阻止您拥有 protected/private setter 和 public getter,或者没有 setter(您必须在另一个方法或构造函数中实例化该值)
Java 中的封装是通过制作 class 的字段 private
来实现的。通过使它们 protected
.
实现较弱的封装
Getter 和 setter 方法没有实现封装。相反,它们为某些类型的封装数据交互提供了一种机制。如果未封装数据,则不需要 getter 和 setter 方法。因此,当然,您可以提供受保护或默认访问的 getters 和 setters,甚至是私有的。或者根本 none。这完全是您希望 class 向谁公开哪些功能的问题。
当一个人制作 getters 和 setters public 时,是因为它们提供了使用 class 所必需的功能,而不是因为该水平访问是封装的要求。
While reading some tutorials, I see that they specify that the getter and setter methods should be public.
这通常在教程中完成,因为它更容易编写,同时还提供“某种面向对象的感觉”,因为您仍然可以使用 getter 和 setters 进行一些控制。
您也可以(不推荐)使用 public 字段并完全省略 setters 和吸气剂:
public class Foo {
public int i;
public String s;
}
但是当使用 setters 时,您可以例如验证数据:
public class Foo {
public void set(int temperature) {
if(temperature < 273) throw new IllegalArgumentException();
this.temperature = temperature;
}
}
但是如果您需要一次验证多个值怎么办?使用 setter 您只能始终验证当前值,但不能同时验证多个 setter 调用。这是 public setter 不好的一种情况。
另一件事是:面向对象的编程很重要的是说出名字:setXYZ
你说的不多。例如,setTemperature
可能适用于恒温器。但仅此而已。也许您甚至得到了更高级的东西:setTemperatureLevel
(值 1-5),然后设置内部 desiredTemperature
,当此值高于当前温度时,您要将 heater
设置为 true
.
使用简单的 setters 时,您无法控制所有这些步骤是否按正确顺序完成,或者是否跳过了某些步骤。但是使用 setLevel
方法在 class 中执行所有这些操作,没有办法搞砸方法调用者。
但是在 Java 世界中当然有一些地方 public setters 和 getter 非常方便:在很多框架中,比如将数据库映射到JSON de/serialization 的 DAO 或 DTO,它使事情变得更容易。因为在这里它被用作读写对象字段的约定。这些对象通常被称为 JavaBeans.
但是当涉及到您的域对象时,我强烈建议将您不希望其他人访问的所有内容保密and/or。
据我了解,封装(在 Java 中)是以某种方式将相关数据和方法包装到对象中的机制,数据对其他 class 隐藏es并且只能通过当前class的方法访问(a.k.a。数据隐藏),如果我错了请纠正我。
在阅读一些教程时,我看到他们指定 getter 和 setter 方法应该是 public。
我知道为什么它不应该是私有的,但为什么不保护或默认?使用受保护或默认的 getter 和 setter 方法是否仍算作封装?
当然可以保护访问者。例如,抽象基础 class 可能会通过使用受保护的 getter 向子 class 公开一些内部状态,而该 getter 不是消费者应该使用的 API 的一部分使用。
也就是说,getters 和 setter 通常在 JavaBeans 的上下文中使用,其中 getters 和 setter define对象的属性。如果它们 public 不可见,那么虽然它们仍然提供封装,但它们不满足特定目的。
您正在阅读的教程是从某个对象的用户(即开发人员)的角度编写的。这些属性需要 public 才能完成它们的工作,大多数 属性 访问器是 public.
封装是为了防止其他对象直接修改值。
如果您将 getter 和 setter 设为私有,则只有 class 中的其他方法才能调用它们。这可能是因为您想验证该值,或者因为您想确保支持多线程或其他一些问题。
如果你让它们受到保护,那么继承和扩展 classes 将能够调用它们,没有其他 classes,甚至你的 main
方法也不能调用 getter 和 setter.
如果您只想公开值,没有什么能阻止您拥有 protected/private setter 和 public getter,或者没有 setter(您必须在另一个方法或构造函数中实例化该值)
Java 中的封装是通过制作 class 的字段 private
来实现的。通过使它们 protected
.
Getter 和 setter 方法没有实现封装。相反,它们为某些类型的封装数据交互提供了一种机制。如果未封装数据,则不需要 getter 和 setter 方法。因此,当然,您可以提供受保护或默认访问的 getters 和 setters,甚至是私有的。或者根本 none。这完全是您希望 class 向谁公开哪些功能的问题。
当一个人制作 getters 和 setters public 时,是因为它们提供了使用 class 所必需的功能,而不是因为该水平访问是封装的要求。
While reading some tutorials, I see that they specify that the getter and setter methods should be public.
这通常在教程中完成,因为它更容易编写,同时还提供“某种面向对象的感觉”,因为您仍然可以使用 getter 和 setters 进行一些控制。
您也可以(不推荐)使用 public 字段并完全省略 setters 和吸气剂:
public class Foo {
public int i;
public String s;
}
但是当使用 setters 时,您可以例如验证数据:
public class Foo {
public void set(int temperature) {
if(temperature < 273) throw new IllegalArgumentException();
this.temperature = temperature;
}
}
但是如果您需要一次验证多个值怎么办?使用 setter 您只能始终验证当前值,但不能同时验证多个 setter 调用。这是 public setter 不好的一种情况。
另一件事是:面向对象的编程很重要的是说出名字:setXYZ
你说的不多。例如,setTemperature
可能适用于恒温器。但仅此而已。也许您甚至得到了更高级的东西:setTemperatureLevel
(值 1-5),然后设置内部 desiredTemperature
,当此值高于当前温度时,您要将 heater
设置为 true
.
使用简单的 setters 时,您无法控制所有这些步骤是否按正确顺序完成,或者是否跳过了某些步骤。但是使用 setLevel
方法在 class 中执行所有这些操作,没有办法搞砸方法调用者。
但是在 Java 世界中当然有一些地方 public setters 和 getter 非常方便:在很多框架中,比如将数据库映射到JSON de/serialization 的 DAO 或 DTO,它使事情变得更容易。因为在这里它被用作读写对象字段的约定。这些对象通常被称为 JavaBeans.
但是当涉及到您的域对象时,我强烈建议将您不希望其他人访问的所有内容保密and/or。