java中this.variable和this.getVariable()有什么区别?

时间:2016-11-21 19:03:31

标签: java methods getter

我目前很困惑,我不知道我应该何时调用get-method。如果我在没有get的情况下调用我的变量,如果我用get调用它,有什么区别。我知道“这个”的作用但是我不确定调用方法和调用变量之间是否存在差异。 例如:

    public class Student() {
    private int idNumber; 
    private String name;
    Student (int idNumber, String name) {
       this.idNumber = idNumber; 
       this.name = name;
      }
      public int getIdNumber() {
       return idNumber;
        }
      public String getName() {
        return name;
       }
      // method to add 2 idNumbers
       public int addNumbers(int no) {
       int result = this.idNumber + no; 
      int result = this.getIdNumber() + no; 
       }

如果在这种情况下调用get方法而不是变量本身,是否有区别? 非常感谢你提前。

5 个答案:

答案 0 :(得分:0)

  

如果调用get方法而不是变量,是否有区别?   在这种情况下呢?

没有区别,但是,如果您使用this.idNumber 直接访问变量而不是使用方法this.getIdNumber()访问变量,代码将更具可读性。如果代码是可读的(这很重要),那么您可以更好地理解它并轻松维护它。

答案 1 :(得分:0)

this.variable是对变量本身的直接引用。 this.getVariable()是一种方法,虽然它可能只是给你this.variable,但它可能会做任何其他事情。这只是一个变量。

这有一些用途。当谈到吸气剂时,我喜欢防御性地编程。

例如,假设我们有以下类结构。

public class School {
    private final Set<Person> teachers = new HashSet<>();

    public boolean addTeacher(Person teacher) {
        return teachers.add(teacher);
    }
}

现在,我们希望功能能够返回学校的教师组合。这可能很诱人......

public Set<Person> getTeachers() {
    return this.teachers;
}

......但这可能会产生一些意想不到的后果。例如,如果您班级的一个客户端执行此操作...

Set<Persons> persons = someSchool.getPersons();
persons.clear();

...然后你的内部人员突然被清空了!这可能是暴露给您的班级客户的意外行为(我已经发生了一些IRL专业案例!)。答案是,通过以稍微不同的方式实施getTeachers(),不会让您的用户访问您的内部私人对象...

public Set<Person> getTeachers() {
    return new HashSet<Person>(this.teachers);
}

现在,getTeachers方法将返回一个全新的人员集。无论用户对getTeachers的结果如何,都不能通过对集合进行修改来修改私有集合(this.teachers)。这使得School类可以更好地控制其内部状态,并且是“getter”何时不返回它“获取”的实际变量的一个很好的例子。

答案 2 :(得分:0)

  

如果我在没有get的情况下调用我的变量,如果我用get ...

调用它,有什么区别

通常,如果您正在谈论访问该类中的属性, 几乎 没有区别,因为您仍在访问相同的属性。

然而,仍有一个细微的差别,我稍后会回到这一点。

现在,如果您要从课外访问该属性。如果属性标有private访问修饰符,则无法访问该属性。

示例:

class Hero{
    private int health;     //inaccessible from anywhere outside the class

    public int getHealth(){
        return health;      //allows access of health outside the class
    }
}

现在假设health被宣布为公开,您只需使用myHero.health直接访问它,有一天您意识到需要将health的数据类型更改为其他类似的内容作为代表健康的一类:

class Health{
    private int minHealth;
    private int maxHealth;
    private int healthValue;
}

但是您已经经常使用myHero.health进行编码,以至于您现在无法更改代码。

现在,假设您使用myHero.getHealth()进行编码。它现在会有所不同,因为所有代码都可以继续使用getHealth()的getter来获取健康值。您需要做的就是更改getHealth()的实现以返回健康值:

class Hero{
    private Health health;     //Data type changed, no worries..

    public int getHealth(){
        return health.getHealthValue();  //Implementation can be changed here..         
    }
}

health的数据类型可以在没有太多后顾之忧的情况下进行更改(就其他直接依赖于它的模块而言)。由于它是private,因此不依赖它,我们可以在不产生太多副作用的情况下对其进行更改。

现在回过头来讨论在类本身中访问属性。我个人认为调用getter仍然是安全的,而不是直接访问属性。

使用以下示例:

class Circle{
    private double radius;
    private double area;

    public double getArea(){
        return Math.PI * radius * radius;
    }
}

这不是一个好的设计,但为了解释,我已经这样写了。

因此,在课程Circle本身中,this.areathis.getArea()可能会做同样的事情。但在某些情况下,吸气者本身可能只是做一份工作,而不仅仅是把你的裸变量传给你。写this.area可能会给你0.0而不是基于半径的区域。

再一次,不是最好的例子,但你明白我的意思..

答案 3 :(得分:0)

对于新类MyClassA和那些字段,最佳做法是: - 添加私人字段 - 为每个字段添加公共getter和setter,以设置值并从字段中获取值

在这种情况下,当你实例化一个新的MyClassB,例如包含MyClassA的实例时,你的myClassB对象只能使用getter和setter,并且不能直接与MyClassA字段交互。

例如,advange可以在将值存储到myClassA之前检查值。

在您的示例中,如果您希望idNumber不能为负数,请使用此setter:

public void setIdNumber(int newValue) {
    if(newValue<0) {
        this.idNumber=newValue*-1;
    } else {
        this.idNumber=newValue;
    }
}

使用setter和getter的另一个好处是你可以锁定要从外部Object读取或写入的字段。您只需要编写getter的代码以允许read或setter允许写入。

将私有字段与getter / setter一起使用的最后一点是,所有使用反射来动态读取/写入未知对象的库都使用这些getter / setter。通过反射,您可以获得任何对象(私有或公共)的字段列表以及用于读/写的字段,您必须为名为“myField”的字段调用“getMyField”/“setMyField”(添加get / set并且在第一个字母的上方)

我知道的最好的例子是序列化!它允许您转换字节序列中的任何对象,以便将其存储在数据库或文件中。然后,您可以读取此序列并反序列化以再次将您的对象置于原点的相同状态。而只有1条指令:)

答案 4 :(得分:-1)

该类的成员变量是私有的,因此不能在类之外使用它们。对于外部世界,您需要使用getVariable(),但在类中,在成员方法中,您可以直接引用该变量。

这就是所谓的&#34; encapsulation&#34;,是面向对象编程的基本部分之一(以及多态和继承)