gpt4 book ai didi

java - 没有封装的类

转载 作者:行者123 更新时间:2023-12-01 17:07:34 25 4
gpt4 key购买 nike

我在理解 Java 中的封装时遇到了一些困难。我所知道的是,封装允许从程序中的其他任何地方隐藏信息(使用私有(private)变量)。但是,谁能告诉我如何创建具有公共(public)数据字段的类会导致问题?我不明白如果类提供了 getter 和 setter 方法,数据是如何隐藏的。

   public class Student{

private int id;
private String name;
private int grade;

public Student(){
}

public Student(int id; String name, int grade){
this.id = id;
this.name = name;
this.grade = grade;
}

public int getId(){
return id;
}

public void setId(int id){
this.id = id;
}

//more code

}

最佳答案

“信息隐藏”一词并不一定意味着信息的安全受到威胁。但首先要谈谈安全主题,在巨著“Code Complete”第 2 版中,Steve McConnell 写道:

“公开成员数据违反了封装性,并限制了您对抽象的控制。”

这里的关键见解是,您失去了对代码使用者之间的交互以及您希望代码如何运行的控制。考虑一下给定示例代码的这种情况:您的老板/客户/老师给了您一个要求/约束​​,内容是:对 id 字段进行一些错误检查,以确保它在范围内(也许只允许正数) 。您将如何实现该要求,以确保每当有人取回 ID 时,它都遵循该要求?

以下是该要求的示例实现:

public void setId(int id){
if(id < 0) {
this.id = 0;
} else {
this.id = id;
}
}

此实现使您可以确定 id 字段在给定要求的情况下已正确设置,这使您可以告诉使用该代码的人员该 id 始终为正数。不幸的是,当其他人使用您的代码时,他们有能力直接引用成员变量并像这样设置它(如果它是公共(public)的):

Student student = new Student();
student.id = -1;

当有人坐在 IDE 前(甚至可能是你自己,同时继续实现代码)时,他们怎么知道不要使用上述设置 id 字段的方法?控制对该字段的访问的最佳方法是仅允许该字段的一个入口点。

也许“信息隐藏”最重要的方面是,如果您通过访问器和修改器控制对成员变量的访问,则可以在用户不知情的情况下进行实现更改。考虑这种情况:您的老板/客户/老师现在要求您将 id 字段加密为字母数字字符串,而不影响已经使用软件版本 1 的代码用户。如果您允许直接访问成员变量,那么您永远无法更改 id 字段的内部表示,而不会潜在地破坏人们可能已经在您的代码之上编写的代码。
他们可能是做这样的事情:

 Student student = new Student();
int currentId = student.id;
int idWithOffset = currentId + 100;

如果你突然需要/想要将 id 设为 String 或 Id 对象,会发生什么?如果您将 id 保留为私有(private),则可以根据需要进行这些更改,并在处理转换逻辑的 setter/getter 中编写代码,并且用户的代码永远不需要更改。

我最后一个(也是个人最喜欢的原因)为什么“信息隐藏”(例如将成员设为私有(private))有助于减少问题,是它删除了代码的又一个细节,否则这些细节需要在 UML 图表、您的大脑、Javadoc 中 float 等等...信息隐藏有助于抽象,以便您在处理该类时可以考虑类内的所有组件和参与者,而在处理其他类时不必将其保留在您的大脑中。

干杯。

此外,关于 Java 语言中的此类问题,Joshua Bloch 的“Effective Java”(第二版)是一个很好的引用。

关于java - 没有封装的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24771825/

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