类的getters()和setters()简化

时间:2015-02-05 11:13:38

标签: java encapsulation setter getter

  • 为什么我们确实需要在我们的类中使用set和get方法来使用私有属性?
  • 在我们的程序过程中真的使用它吗?
  • 我们仍然可以在没有它的情况下使其工作(不将私有属性更改为public)吗?

这是我们使用set和get方法时的源代码示例:

public class Dog {

    private String dogName;
    private int dogAge;

    public Dog(String dogName, int dogAge) {
        this.dogName = dogName;
        this.dogAge = dogAge;
    }

    public String getDogName() {
        return dogName;
    }

    public void setDogName(String dogName) {
        this.dogName = dogName;
    }

    public int getDogAge() {
        return dogAge;
    }

    public void setDogAge(int dogAge) {
        this.dogAge = dogAge;
    }

    @Override
    public String toString() {
        return "Dog{" + "dogName=" + dogName + ", dogAge=" + dogAge + '}';
    }

}

9 个答案:

答案 0 :(得分:7)

  

为什么我们确实需要在我们的类中使用set和get方法   使用私有属性?

如果您想要隐藏实施细节(encapsulation - a fundamental principle of object-oriented programming),您不希望外面的人访问它们,您只提供一种返回某些价值的方法,但您不会想揭示实施。

有时,当您设置一个值时,您需要更改可能相关的其他变量,或者更改某些逻辑,它并不总是一个简单的赋值语句。

  

在我们的程序过程中真的使用它吗?

很难回答这个问题,这实际上取决于该计划。如果您想要获取或设置值,请使用 setters getters

  

如果没有它,我们还能让它发挥作用吗?

当你拥有public字段而不是private时,正常 ,在设计意义上,建议以{{1}开头}变量总是,只有在必须时才更改它们。

答案 1 :(得分:2)

如果可以的话,我个人不喜欢安装者和吸气者,并用公共场地替换它们。但是,保留它们有技术上的理由:

  • 模拟:诸如Mockito或Easymock之类的模拟框架无法模拟或覆盖直接字段访问
  • 代理:由于各种原因,使用代理(DI框架中的Scopin,日志记录等)。同样,不适用于字段
  • 基于JavaBeans的框架:XML序列化的一些框架不支持字段访问。

因此,在许多情况下使用getter / setter只会让您的生活更轻松。但是,如果你负责所有代码,具体取决于你的类,只要你遇到问题,就在eclipse中使用Refactor-> Encapsulate Field(非常确定所有主要IDE中都存在类似的功能)。

答案 2 :(得分:2)

如果您没有看到封装点,请允许我演示现实生活"例子(其中。

private boolean amIDrunk = true;

public boolean getAmIDrunk(Object asker){
    if (asker instanceof PoliceOfficer){
        return false;
    } else if (asker instanceof DrinkingBuddy ){
        return true;
    }
    return amIDrunk;
}

public void setAmIDrunk(boolean setter){
    if (hadLessThen10Beers()) {
        this.amIDrunk = false;
        return;
    }
    this.amIDrunk = setter;
}

当然,这是一个' nitwit'例如,但它只是为了表明有时,只是因为你打电话给一个二传手,可能有理由不设置这个值,有时,当一个getter被调用时,可能有一个原因,你不要&# 39; t想要返回实际值。

无论如何,要继续这个例子:将amIDrunk作为私人变量,确保其他人不会宣称你是“醉酒”。通过将amIDrunk设置为true,而不执行您自己的set方法来同意它。

答案 3 :(得分:1)

使用“访问方法”(setter和getter)的另一个原因是它是IoC中使用的约定(控制反转)。所以像Spring等框架。 创建它们可能看起来很乏味,但如果您将eclipse用作IDE,则可以自动生成setter和getter(源|生成getter和setter)。

此外,您的私有成员变量很重要。 假设你有:

public String telephoneNumber;

什么阻止某人这样做:

object.telephoneNumber = "not a telephone number".

如果你使用了setter,你可以这样做:

public void setTelephoneNumber(final String telephoneNumber) {
   if (telephoneNumber==null||telephoneNumber.length()==0) {
      throw new IllegalArgumentException("you cannot supply null telephone numbers");
   }
   ... etc.
   this.telephoneNumber = telephoneNumber;
}

以这种方式,您的telephoneNumber成员变量将只持有有效的telephoneNumber。您的类现在完全自包含(封装),因为您不依赖外部类来尊重您的成员变量。

答案 4 :(得分:0)

Setter和getter用于实现Encapsulation

是的,我们可以让它在没有制定者和吸气剂的情况下发挥作用。

答案 5 :(得分:0)

  • 为什么我们确实需要在我们的类中使用set和get方法来使用私有属性?

还使用了Getters()Setters()方法,因此我们可以从外部访问类中的私有字段。

public class myClass(){
  public void newDog(){
    Dog d=new Dog("Foxy", 2);
    d.setDogAge(d.getDogAge()+1);//get the age of the dog and increment it
  }
}
  • 在我们的程序过程中真的使用它吗?

当我们需要使用私有字段(读取(with getters)/ 编写with setters)操作时,会使用它们>与之前的例子相似。)

  • 没有它我们还可以让它工作吗?

是的,当然我们可以将这些字段声明为公共字段(默认情况):

String dogName;
int dogAge;

最明显的例子是:

public class myClass(){
  public void newDog(){
    Dog d=new Dog("Foxy", 2);
    d.dogAge=d.dogAge+1;//get the age of the dog and increment it without getters and setters
  }
}

请查看Accessors and Mutators以获取更多信息。

答案 6 :(得分:0)

为什么我们确实需要在我们的类中使用set和get方法来使用私有属性?

这个术语“封装”来自面向对象编程。封装是隐藏实现但允许访问。

在我们的计划过程中真的使用它吗?

Getters可以获得设置器设置值的值。在您的代码中,您将狗name设置为String,将age设置为int。最后,你有吸气剂来获得设定值。

如果没有它,我们还能让它运作吗?

是。您可以通过将private声明的变量更改为public来使其工作。实际上private关键字会使该变量仅对声明它的类可见。

这将为您提供有关对象的详细说明。 http://docs.oracle.com/javase/tutorial/java/concepts/object.html

答案 7 :(得分:0)

我建议阅读Kotlin kotlinlang.org

您可以在1行中为POJO编写getter / setter: e.g。

data class Customer(val name: String, val email: String, val company: String)

答案 8 :(得分:0)

Getters和setter确实是封装原则,答案here中有一个很好的解释。根据惯例,除了存储和检索属性之外,getter和setter不能添加任何功能。由于这是这些方法的唯一功能,因此越来越多的人支持将这些变量设置为public并直接访问它们,而无需使用这些方法。由于这些方法只公开它们,因此没有功能差异。对于惯例,一些框架,getter和setter是预期的。

您可以随时让IDE(EclipseIntelliJNetbeans)为您编写getter和setter。但是,如果您希望您的代码干燥且易于阅读,您还可以考虑使用Lombok,这会自动为您创建getter和setter。