Java 实例是否应该使用setter/getter来访问自己的私有数据成员?
从每一节编程入门课开始,我们都被教导使用访问器和设置器,而不是公开类的内部工作。学生们将在稍后的时间学习练习的要点,但现在我了解到这种做法(a)防止实现成为合同导出API的一部分,(B)改进封装和数据隐藏,以及(C)允许保证是否应该发生某些操作(增加计数器、记录某些内容等)无论何时设置或访问变量 在实例本身中使用getter/setter如何?比如说,Java 实例是否应该使用setter/getter来访问自己的私有数据成员?,java,c++,class,oop,Java,C++,Class,Oop,从每一节编程入门课开始,我们都被教导使用访问器和设置器,而不是公开类的内部工作。学生们将在稍后的时间学习练习的要点,但现在我了解到这种做法(a)防止实现成为合同导出API的一部分,(B)改进封装和数据隐藏,以及(C)允许保证是否应该发生某些操作(增加计数器、记录某些内容等)无论何时设置或访问变量 在实例本身中使用getter/setter如何?比如说, class A { private: int number = 43; public: int getNumber();
class A {
private:
int number = 43;
public:
int getNumber();
void setNumber(int);
};
说到底,这真的重要吗?我们是否可以遵循任何指导原则,或者是否有任何关于此场景的书面说明?这个问题在我编程时经常出现在我的脑海中,但我从未见过有人讨论实例本身的访问器/变异器
谢谢大家! 从实例中调用getter或setter的合适用例是当您需要利用getter或setter提供的副作用、验证或计算时。如果没有必要,为什么要从对象内部复制这样的功能
纯粹主义者将把副作用、验证或计算重构成他们自己的私有方法,然后在内部和从getter/setter调用该方法。这样,您就不会将公共接口与任何内部实现细节耦合。从实例中调用getter或setter的合适用例是当您需要利用getter或setter提供的副作用、验证或计算时。如果没有必要,为什么要从对象内部复制这样的功能
纯粹主义者将把副作用、验证或计算重构成他们自己的私有方法,然后在内部和从getter/setter调用该方法。这样,您就不会将公共接口与任何内部实现细节耦合。getter/setter用于封装。使用getter/setter访问自己成员的类是极端的封装!答案是没有必要的,这样做没有好处
当getter/setter中有一些逻辑并且希望始终应用它时,甚至对于私有成员访问,也可以使用getter/setter。一个这样的例子是由getter合成的派生值。无论是另一个类还是同一个类,它们都必须经过getter。getter/setter用于封装。使用getter/setter访问自己成员的类是极端的封装!答案是没有必要的,这样做没有好处
当getter/setter中有一些逻辑并且希望始终应用它时,甚至对于私有成员访问,也可以使用getter/setter。一个这样的例子是由getter合成的派生值。无论是另一个类还是同一个类,它们都必须通过getter。这将归结为一致性。IMHO,一旦创建了访问器方法,就没有必要直接访问实际变量,即使是从封闭类中访问 通过使用您在类本身中公开的相同setter和getter,无论何时访问您的成员变量,您都可以获得保证的公共行为。读取和修改只有一个过程:公开还是内部
想想看,如果有一天你在一个名为
myVar
的特定成员整数上引入一个零检查会怎么样?只有使用setNumber的代码才会具有该功能。类中所有直接使用变量的行都必须单独修改。它将归结为一致性。IMHO,一旦创建了访问器方法,就没有必要直接访问实际变量,即使是从封闭类中访问
通过使用您在类本身中公开的相同setter和getter,无论何时访问您的成员变量,您都可以获得保证的公共行为。读取和修改只有一个过程:公开还是内部
想想看,如果有一天你在一个名为
myVar
的特定成员整数上引入一个零检查会怎么样?只有使用setNumber的代码才会具有该功能。类中所有直接使用变量的行都必须单独修改。我目前正在使用Mockito framework编写大量测试,该框架用于制作模拟,当然,模拟对象的所有对象属性都设置为null。因此,如果我想调用该对象上的某个实际方法,如果该方法直接调用属性,我将得到NullPointerException,或者某种意外行为,因为属性为null
相反,如果我在类中使用getter,我可以模拟getX()方法来返回属性应该设置为的任何值,我不必担心
这是我发现在类中使用getter很有用的一个用例
我能想到的另一个原因是,它们可能是获取或设置除赋值之外的其他计算。我目前正在使用Mockito框架编写大量测试,该框架用于制作模拟,当然,模拟对象的所有对象属性都设置为null。因此,如果我想调用该对象上的某个实际方法,如果该方法直接调用属性,我将得到NullPointerException,或者某种意外行为,因为属性为null 相反,如果我在类中使用getter,我可以模拟getX()方法来返回属性应该设置为的任何值,我不必担心 这是我发现在类中使用getter很有用的一个用例 我能想到的另一个原因是因为