gpt4 book ai didi

java - 将实例变量暴露给其他类的正确方法

转载 作者:行者123 更新时间:2023-11-30 09:04:25 25 4
gpt4 key购买 nike

谁能帮我理解一下:

“例如,对象的实例变量(不是常量的成员字段)应该始终是私有(private)的。期间。没有异常(exception)。永远。我是认真的。(您偶尔可以有效地使用 protected 方法,但 protected 实例变量是可憎的。)出于同样的原因,你永远不应该使用 get/set 函数——它们只是使字段公开的过于复杂的方法(尽管返回完整对象而不是基本类型值的访问函数在返回对象的类是设计中的关键抽象的情况)。” - http://www.javaworld.com/article/2073649/core-java/why-extends-is-evil.html

我不明白他的意思,“你永远不应该出于同样的原因使用 get/set 函数——它们只是将字段公开的过于复杂的方法。”假设我有一个带有 Name 和 Age 实例变量的简单 Person 类。我应该如何将这些提供给其他类(class)?他的意思是我应该创建一个数据传输对象吗?这是一个正确的实现吗?这真的比在 Person 类中使用 getter 和 setter 更好吗?

public class Person {
private PersonData personData;

public Person (String name, int age){
this.personData =
new PersonData(name, age);
}

// get personData

// person methods...
}

// data transfer object
class PersonData {
private String name;
private int age;
public PersonData(String name, int age){
this.setName(name);
this.setAge(age);
}
// getters and setters ...
}

最佳答案

评论多于答案...

本文致力于确定松散耦合的需求/优势,以及获得它的技术。

要点之一是避免依赖对象的内部数据结构,而只使用其运算符。在这一点上,自动使您的状态可访问是不好的,因为使用您的类的对象可能依赖于这些属性,而不是使用提供给它们的更“精细”的操作。

根据我对这篇文章的理解,一个可能的例子如下:

想象一个具有两个操作的 Person 类/接口(interface),例如,isOldEnoughToBuyBeerisOldEnoughToDriveCars

如果您在 Person 中为 dateOfBirth 创建一个 setter/getter,那么您就是在绑定(bind) Person 的实现来拥有这样的属性,并将操作实现为“再次检查当前日期 dateOfBirth 属性并根据年数返回 true”。

当然,“出于同样的原因,您永远不应该使用 get/set 函数——它们只是使字段公开的过于复杂的方法”这句话可能过于严格;尽管通过 getters/setters 进行访问也有其后果,这是一个很好的观点,但很难想象属性仅在持有它们的类内部使用。

关于java - 将实例变量暴露给其他类的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25231519/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com