set和get方法与public变量的优点

时间:2012-06-17 12:49:52

标签: java class methods private public

  

可能重复:
  Why use getters and 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;
    }

}

4 个答案:

答案 0 :(得分:73)

我有一天在SO上看到的,作为答案(由@ ChssPly76编写)为什么要使用getter和setter

  

因为从现在起2周(几个月,几年),你意识到你的   setter需要做的不仅仅是设置值,你也会意识到   该物业已被直接用于其他238个类别: - )

还有更多优势:

  1. getters和setter 可以在其中进行验证,字段不能
  2. 使用getter,您可以获取所需类的子类
  3. getters and setters 是多态的,字段不是
  4. 调试可以简单得多,因为断点可以放在一个方法内,而不是靠近给定字段的许多引用。
  5. 他们可以隐藏实施变更
  6. 之前:

    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 {{1}}停止调试器,则只能使用setter中的断点。

答案 1 :(得分:8)

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

例如:

 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类型的Object Refernce变量作为Argument从Calling方法分配给被调用方法的超类参数的Object Referencence变量。

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

             }
         }
      }

答案 2 :(得分:4)

  1. 有些库要求这样做才能实现“Java Bean标准”。
  2. 一个setter / getter可以在一个接口中,一个属性不能在一个接口中
  3. 可以在下层课程中轻松覆盖Setter / getters。
  4. setters / getters抽象出信息,无论是按需计算价值还是仅仅是物业的存取物

答案 3 :(得分:1)

看待事物的某种倒退方式。

在任何情况下,最好通过将成员变量公开来暴露你的班级的内部工作,所以任何消费者都可以做设计师从未认识的事情,导致失败的盛宴和崩溃的聚宝盆?

答案本身真的是一个人不是吗?

OO的基石原理,封装。公共成员变量基本上是全局变量,带有前缀...