关于java:set和get方法与public变量的优点

Advantage of set and get methods vs public variable

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Why use getters and setters?

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

例如,第二种情况比第一种情况好吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//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;
    }

}


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

Because 2 weeks (months, years) from now when you realize that your
setter needs to do more than just set the value, you'll also realize
that the property has been used directly in 238 other classes :-)

还有很多优点:

  • getter和setter可以在其中进行验证,字段不能
  • 使用getter可以获得所需类的子类。
  • getter和setter是多态的,字段不是
  • 调试可以简单得多,因为断点可以放在一个方法中,该方法不靠近给定字段的许多引用。
  • 它们可以隐藏实现更改:
  • 之前:

    1
    2
    3
    4
    private boolean alive = true;

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

    后:

    1
    2
    3
    4
    5
    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时停止调试器,那么只能在setter中使用断点。


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

    如:

    1
    2
    3
    4
    5
     public class A{

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

       }

    使用setter可以用于通过检查输入来设置变量。保持实例变量是私有的,getter和setter是一种封装形式。GETER和SETER也与JavaBean标准兼容,

    吸气剂和二传手也帮助实现多态性概念

    如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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;
           }

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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");

                 }
             }
          }


  • 一些库要求实现"Java bean标准"。
  • setter/getter可以在接口中,属性不能在接口中
  • setter/getter可以很容易地在子类中被重写。
  • setter/getter抽象出一个值是按需计算还是只计算一个属性的访问器的信息。

  • 有点倒退的看待事物的方式。

    在任何情况下,通过公开一个成员变量来公开你的类的内部工作是更好的吗?这样,它的任何消费者都可以做一些设计师从未想到过的事情,导致一场失败的盛宴和大量的崩溃?

    答案本身就是这样的,真的吗?

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