我有一个叫做Student的课,下面是代码:-
public class Student {
public String name;
}
然后从另一个班级访问该名称。
public class Example {
public static void main(String[] args) {
Student s = new Student();
s.name = "David";
System.out.println(s.name);
}
}
但是我在很多书中都听到并看到了很多代码,他们说将这些代码设为私有并使用如下方法访问它们:-
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
然后
public class Example {
public static void main(String[] args) {
Student s = new Student();
s.setName("David");
System.out.println(s.getName());
}
}
我想知道为什么以及它们之间的区别是什么。为什么使用控制状态的方法被认为更健康?
答案 0 :(得分:2)
提供getter和setter的直观因素很少。
您将对存储的内容进行具体控制。您可以使用计算在内部数据结构中存储与传入值不同的值,并且可以根据业务逻辑对数据进行验证。
由于要使用setter隐藏数据,因此在任何时间点,如果您想更改用于计算存储的最终/所需数据的业务逻辑,或者想要更改内部数据结构的数据类型, ,您可以这样做而不会影响/更改客户端代码或用户代码。好处是很多的,尤其是当您编写将具有n个客户端或用户数量的库时。
这也是Oops概念以及数据隐藏和抽象设计的关键。
答案 1 :(得分:2)
默认情况下,让您的班级字段公开是一种不好的做法。任何人都可以访问公共领域。因此,您不能确保一次设置的值与要获得的值相同。
有几种方法可以为实例的字段分配值。一种是通过构造方法:
public class Student {
private String name;
public Student(String name){
this.name = name;
}
public void getName(String name) {
return name;
}
}
请注意,您需要使用getter方法(getName
)来访问您的私有字段。
另一种方法是使用setter和getter,如您所提及,但这面临着我们试图避免使用私有字段的相同问题。
答案 2 :(得分:1)
因为如果您的变量是公共变量,则可以将其更改为所需的值,而不会检查该值是什么。使用setter时,在将变量分配给程序员所需的变量之前,该方法可以检查传递给变量的变量是否可行。例如,它可以检查传递的值是否为空。
由于该变量是私有变量,因此只能通过getter函数进行访问,因此仅需要使用getter方法。
但是,我们还可以检查getter方法中的不同内容,例如,要访问的变量是否已初始化。
答案 3 :(得分:1)
首先,当您允许其他对象像这样直接操纵内部状态时,它永远是不健康的。
与其他答案一样,使用设置器至少可以确保某种形式的控制(例如,检查传递的空值或线程同步),但这仍然不是一个好习惯。
字段应该是类的私有实现细节,如果有的话,您应该提供getter方法。但是,默认情况下拥有公共字段或为所有字段都具有吸气剂和吸气剂的想法是完全错误的。
答案 4 :(得分:1)
想想,从现在开始的2周(月,年)之后,当您意识到设置者需要做的不仅仅是设置值时,您还将意识到该属性已直接用于其他238个类中,那么您238行有更改。
或者如果要在set方法中设置默认值,或者要在setter或getter方法中添加更多业务逻辑,则在这种情况下无法直接使用。假设您有一个setSpeed(int speed)方法。但是,您希望只能将最大速度设置为100。您可以执行以下操作:
public void setSpeed(int speed) {
if ( speed > 100 ) {
this.speed = 100;
} else {
this.speed = speed;
}
}
现在,如果您在代码中的任何地方都使用公共字段,然后又意识到需要上述要求,该怎么办?尽情享受搜寻公共领域的各种用法,而不仅仅是修改您的设置器。