设置和获取方法与公共变量的优点

2022-08-31 14:21:55

可能的重复:
为什么使用 getter 和 setters?

使方法访问类中的私有变量而不是公开变量有什么好处吗?

例如,第二种情况是否比第一种情况更好?

//Case 1
public class Shoe{
    public int size;
}

//Case 2
public class Shoe{
    private int size;
    public int getSize(){
        return size;
    }

    public void setSize(int sz){
        size = sz;
    }

}

答案 1

有一天我在SO上看到的答案(由@ChssPly76撰写)为什么使用getter和setters

因为从现在开始的2周(几个月,几年)后,当你意识到你的设置者需要做的不仅仅是设置值时,你也会意识到该属性已被直接用于238个其他类:-)

还有更多优势:

  1. getter 和 setter 可以在其中进行验证,字段不能
  2. 使用 getter,你可以得到想要的类的子类。
  3. getter 和 setter 是多态的,字段不是
  4. 调试可以简单得多,因为断点可以放在一个方法中,而不是靠近该给定字段的许多引用。
  5. 它们可以隐藏实现更改

以前:

private boolean alive = true;

public boolean isAlive() { return alive; }
public void setAlive(boolean alive) { this.alive = alive; }

后:

private int hp; // change!

public boolean isAlive() { return hp > 0; } // old signature 
 //method looks the same, no change in client code
public void setAlive(boolean alive) { this.hp = alive ? 100 : 0; }

编辑:当你使用Eclipse时,还有一个新的优势 - 你可以在场上创建观察点,但如果你有设定器,你只需要一个断点,然后......断点(例如在 setter 方法中)可以是条件的,而观察点(在场上)则不能。因此,如果您只想停止调试器,则仅当只能使用 setter 内的断点执行此操作时。x=10


答案 2

使用公共变量可能会导致为变量设置错误的值,因为无法检查输入值

例如:

 public class A{

    public int x;   // Value can be directly assigned to x without checking.

   }

使用 setter 可用于通过检查输入来设置变量。保持实例 varibale 私有,getter 和 setter public 是 Encapsulation getter 的一种形式,setter 也与 Java Beans 标准兼容,

getter 和 setter 也有助于实现多态性概念

例如:

public class A{

     private int x;      //


      public void setX(int x){

       if (x>0){                     // Checking of Value
        this.x = x;
       }

       else{

           System.out.println("Input invalid");

         }
     }

      public int getX(){

          return this.x;
       }

多态示例:我们可以将 Sub 类型的对象引用变量作为调用方法的参数分配给被调用方法的超类参数的对象引用变量。

public class Animal{

       public void setSound(Animal a) {

          if (a instanceof Dog) {         // Checking animal type

                System.out.println("Bark");

             }

         else if (a instanceof Cat) {     // Checking animal type

                 System.out.println("Meowww");

             }
         }
      }