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方法来同意它。
为什么我们完全需要使用这个集合,并在我们的类中使用私有属性获取方法?
如果你想隐藏实现的细节( 封装 – 面向对象编程的一个基本原则 ),你不希望外部的人访问它们,你只提供一个返回值的方法,但你不想揭示实施。
有时候,当你设置一个值时,你需要改变其他可能相关的变量,或者改变一些逻辑,这并不总是一个简单的赋值语句。
在我们的程序过程中真的被使用了吗?
回答这个问题是非常难的,这真的取决于程序。 当你想得到或者设置一个值的时候,你可以使用setters和getters 。
我们还可以在没有它的情况下工作吗?
当然,当你有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