封装 - 在同一个 class 中使用 getter?

Encapsulation - use getters in same class?

假设我有这个简化的 class:

public class Employee {
   private final String name;
   private int age;
   private int salary;


   public Employee(String name, int age, int salary) {
      name = name;
      age = age;
      salary = salary;
   }

   public Employee(Employee copyEmployee) {
      name = copyEmployee.name;
      age = copyEmployee.age;
      salary = copyEmployee.salary;
   }

   public void riseSalary() {
      if(age > 40) {
         salary += 500;
      }
   }

   public int getAge() {
      return age;
   }

   public String getName() {
      return name;
   }

   public int getSalary() {
      return salary;
   }

   private void setSalary(int salary) {
      salary = salary;
   }
}

我将我的字段声明为私有。并通过 getName()、getAge() 和 getSalary() 向外部提供对其值的访问。

适当的封装是否也要求我也只能从 class 方法中访问这些字段?

例如

public void riseSalara() {
   if(getAge() > 40) {
      setSalary(getSalary()+500);
   }
}

或者在我的复制构造函数中使用它们,因为它们是相同的 class 类型,所以我可以访问私有字段?

我必须为作业写一个 class,其中一部分是 "use encapsulation"。然而,class字段只需要被同一个对象或同一个class的不同对象访问。封装应该走多远?

封装就是把一个东西装进一个胶囊里,从外面看起来很整洁。你在里面做什么是你的选择。

在某种程度上,我们的目标是让通过漂亮的界面编写有史以来最丑陋的代码成为可能。您可以每天更改 class 中的代码,但不能更改界面,因为它需要隐藏 "implementation details".

有时使用内部 getter 和 setters 是有意义的,特别是如果这样可以减少代码重复,例如当 setter 中有需要强制执行的规则时。将 setters 和 getters 视为您可以随意使用的方法。它们不是强制性的(在我看来,"correct" OO 始终是一个见仁见智的问题。)