【问题标题】:Java Public Var question [duplicate]Java Public Var问题[重复]
【发布时间】:2011-03-21 10:03:40
【问题描述】:

可能重复:
Property and Encapsulation

NEWB 警报!!

我从 Android 和 Java 开始,我开始理解它,但我想知道为什么我应该使用 getter 和 setter 而不仅仅是公共变量?

我看到很多人创建一个私有变量并创建一个 get 和 set 方法。

这里的想法是什么?

【问题讨论】:

标签: java getter-setter


【解决方案1】:

它被称为封装,这个概念是面向对象编程的核心。这个想法是你隐藏你的类的实现并且只公开合同,即隐藏 how 并且只公开 what。您可以通过将变量设为私有来隐藏变量,并提供公共的 setter-getter 和其他公共方法,客户端调用这些方法与您的类进行通信。它们与方法的实际实现或变量的存储方式无关。

例如,假设您有一个将电话号码存储为 Long 对象的类:

public class ContactInfo {
    private Long phoneNo;
    public Long getPhoneNo() {
        return phoneNo;
    }
    public void setPhoneNo(Long phoneNo) {
        this.phoneNo = phoneNo;
    }
}

由于类的客户端只能看到 getter/setter,因此您可以通过将电话号码表示转换为 PhoneNumber 对象来轻松更改类/方法的实现。 ContactInfo 的客户根本不会受到影响

public class ContactInfo {
    private PhoneNumber phoneNo;
    public Long getPhoneNo() {
        return phoneNo.getNumber();
    }
    public void setPhoneNo(Long phoneNo) {
        this.phoneNo = new PhoneNumber(phoneNo);
    }
}
public class PhoneNumber {
    private Long number;
    public PhoneNumber(Long number) {
        this.number = number;
    }
    public Long getNumber() {
        return number;
    }
}

【讨论】:

  • +1。请注意,这意味着您应该始终为每个字段提供 getter 和 setter;在某些情况下,您的设计可能需要完全没有公共访问权限的字段。
  • @Feanor。同意!这是私有变量的情况。然而,OP 想知道为什么要使用公共 getter/setter 而不是公共变量,所以答案假设需要公共访问。
  • 毫无疑问,我认为您的答案很明确。当我开始学习 Java 时,我不明白人们可能不想通过 get/set 公开每个字段。我认为既然 OP 提到了新手,那么添加那一小部分是值得的。
【解决方案2】:

涉及的 OOP 概念是封装(google it)。 其中一些优点是:您可以为 setter(mutators)和 getter(访问器)指定不同的访问级别,例如 public getter 和 private setter。另一个优点是您可以添加其他代码,而不是更改或检索值。例如,您可能想要检查设置值的有效性,或者您想要抛出异常或引发一些事件以响应将变量更改为某个值。如果您在访问器或修改器中实现这些,您还可以更改它们的实现,而无需更改类外的任何代码。

【讨论】:

    【解决方案3】:

    我相信这个想法是“信息隐藏”http://en.wikipedia.org/wiki/Information_hiding

    它还用于控制对变量的访问(提供接口)。例如,您可以提供一个 getter 而不是一个 setter,以便它们可以被读取但不能被写入。而如果一切都是公开的,那么任何东西都可以读取和写入变量。

    同样重要的是任何检查/验证都需要设置一个变量。例如,您有一个不允许为空的String name,但如果它是公开的,则很容易被遗忘并设置为name = ""。如果您有诸如public boolean setName(String newName) 之类的设置器,您可以检查newNames 的长度,如果它通过并且是否设置,则返回真或假

    【讨论】:

      【解决方案4】:

      这个概念叫做封装。

      它试图做的是将类的内部结构与其行为分开。

      例如,假设有这样一个类

      public class Point{
      
        private   float x;
        private   float y;
      
        public float getX(){
      
           return x;
        }
      
        public float getY(){
          return y;
        }
      
        public float distanceToZero2(){
      
           return x*x + y*y
        }
      
        public float getAngle(){
          //havent considered the x = 0 case. 
          return atan(y/x);
      
         }
      
      public boolean isInFirstQuad(){
      
         return x>0 && y>0;
      }
      }
      

      在这种情况下,封装隐藏了类的内部结构,只暴露了Point可用的操作。如果你不喜欢它,你可以改变它的内部结构并保持它的行为(例如,将 carthesian 坐标更改为极坐标)。

      任何使用这个类的人都不会关心它,他/她会很高兴他们有一个具有这个功能的 Point 类。

      【讨论】:

        【解决方案5】:

        除了封装之外,在某些情况下,您还可以控制获取或设置变量的值。例如,您要验证应为 >=1

        age 变量的值
        class Person {
           private int age = Integer.MIN_VALUE;
        
        public void setAge(int age){
           if(age>=1)
              this.age = age;
        }
        
        
        public int getAge(){
           return age;
        }
        }
        

        【讨论】:

          猜你喜欢
          • 2012-09-21
          • 2011-02-14
          • 2016-06-19
          • 2021-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-23
          相关资源
          最近更新 更多