getters()和setters()简化一个类

  • 为什么我们完全需要使用这个集合,并在我们的类中使用私有属性获取方法?
  • 在我们的程序过程中真的被使用了吗?
  • 我们还可以让它在没有它的情况下工作吗(没有改变公有的私有属性)?

当我们使用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 + '}'; } } 

如果你没有看到封装的要点,那就让我用一个“真实生活”的例子来展示。

 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; } 

当然,这是一个“数独”的例子,但仅仅是为了表明,有时候,仅仅因为你调用了一个setter,就可能有一个不设置这个值的理由,有时当调用getter时,可能有一个原因,你不想返回实际的价值。

无论如何,继续这个例子:将amIDrunk作为一个私有变量,通过设置amIDrunk为true,确保别人不会声明你为“醉”,而不需要实现你自己的set方法来同意它。

为什么我们完全需要使用这个集合,并在我们的类中使用私有属性获取方法?

如果你想隐藏实现的细节( 封装 – 面向对象编程的一个基本原则 ),你不希望外部的人访问它们,你只提供一个返回值的方法,但你不想揭示实施。

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

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

回答这个问题是非常难的,这真的取决于程序。 当你想得到或者设置一个值的时候,你可以使用settersgetters

我们还可以在没有它的情况下工作吗?

当然,当你有public领域而不是private领域的时候,在设计意义上,它建议始终使用private变量,并且只在必要时才改变它们。

如果可以的话,我个人不喜欢二传手和吸引者,并用公共领域取而代之。 但是,有技术上的理由让他们:

  • 嘲笑:Mockito框架,如Mockito或Easymock不能模拟或覆盖直接的字段访问
  • 代理:由于各种原因,使用代理(DI框架中的Scopin,日志记录等)。 再次,不适用于领域
  • 基于JavaBeans的框架:用于XML序列化的一些框架不支持字段访问。

所以,在许多情况下使用getters / setters只是让你的生活更轻松。 但是,如果你根据你的类负责所有的代码,只要在遇到问题时就使用eclipse中的Refactor-> Encapsulate Field(相当确定类似的功能存在于所有主要的IDE中)。

使用“访问方法”(setter和getter)的另一个原因是它是IoC (控制反转)中使用的约定。 所以像Spring这样的框架,创建它们可能看起来很乏味,但是如果你使用eclipse作为IDE,你可以自动生成setter和getters(source | generate getters和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成员变量将只保存有效的电话号码。 你的类现在是完全自包含的(封装),因为你不依赖于外部类来尊重你的成员变量。

Setter和Getter被用来实现封装 。

是的,我们可以在没有制定者和获得者的情况下工作。

我建议阅读关于Kotlin kotlinlang.org

你可以在1行中写POJO的getters / setters:例如

 data class Customer(val name: String, val email: String, val company: String) 
  • 为什么我们完全需要使用这个集合,并在我们的类中使用私有属性获取方法?

Getters()Setters()方法也被称为Accessors和Mutators ,所以我们可以从外部访问类中的私有字段。

 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 } } 

请查看TutorialsPoint的封装教程以获取更多信息。

吸气剂和吸附剂确实是用于封装的原理,在这里的答案中有一个很好的解释。 按照惯例getter和setter不能添加任何功能,除了存储和检索属性。 由于这是这些方法唯一的做法,因此将这些变量设置为public并直接访问这些变量的支持越来越多,没有这些方法。 由于这些方法只公开暴露他们,没有功能差异。 对于约定,以及一些框架,我们期望getter和setter。

你可以随时让你的IDE( Eclipse , IntelliJ , Netbeans )为你写getter和setter。 但是如果你想让你的代码变得干干净净并且容易阅读,你也可以考虑使用Lombok ,它会自动为你制作getter和setter。

为什么我们完全需要使用这个集合,并在我们的类中使用私有属性获取方法?

这个术语“封装”在面向对象编程下。 封装是你隐藏的实现,但给予访问。

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

Getters在那里得到一些价值的地方,setters是设置一个值。 在你的代码中,你把狗的name设置为一个String并把age为一个int 。 最后你有getters获得设定值。

我们还可以在没有它的情况下工作吗?

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

这给你一个关于对象的详细解释。 http://docs.oracle.com/javase/tutorial/java/concepts/object.html