Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实例是否应该使用setter/getter来访问自己的私有数据成员?_Java_C++_Class_Oop - Fatal编程技术网

Java 实例是否应该使用setter/getter来访问自己的私有数据成员?

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();

从每一节编程入门课开始,我们都被教导使用访问器和设置器,而不是公开类的内部工作。学生们将在稍后的时间学习练习的要点,但现在我了解到这种做法(a)防止实现成为合同导出API的一部分,(B)改进封装和数据隐藏,以及(C)允许保证是否应该发生某些操作(增加计数器、记录某些内容等)无论何时设置或访问变量

在实例本身中使用getter/setter如何?比如说,

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很有用的一个用例

我能想到的另一个原因是因为