这是我们使用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 + '}';
}
}
答案 0 :(得分:7)
为什么我们确实需要在我们的类中使用set和get方法 使用私有属性?
如果您想要隐藏实施细节(encapsulation - a fundamental principle of object-oriented programming),您不希望外面的人访问它们,您只提供一种返回某些价值的方法,但您不会想揭示实施。
有时,当您设置一个值时,您需要更改可能相关的其他变量,或者更改某些逻辑,它并不总是一个简单的赋值语句。
在我们的程序过程中真的使用它吗?
很难回答这个问题,这实际上取决于该计划。如果您想要获取或设置值,请使用 setters 和 getters 。
如果没有它,我们还能让它发挥作用吗?
当你拥有public
字段而不是private
时,正常 ,在设计意义上,建议以{{1}开头}变量总是,只有在必须时才更改它们。
答案 1 :(得分:2)
如果可以的话,我个人不喜欢安装者和吸气者,并用公共场地替换它们。但是,保留它们有技术上的理由:
因此,在许多情况下使用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)
还使用了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)