我对getter/setter和构造函数的用法有点困惑(参见下面的示例代码)
public class ExampleClass {
private int value = 0;
public ExampleClass () {
value = 0;
}
public ExampleClass (int i) {
this.value = i;
}
public int getValue() {
return value;
}
public void setValue(int val) {
this.value = val;
}
public static void main(String[] args) {
ExampleClass example = new ExampleClass (20);
example.setValue(20);
//Both lines above do same thing - why use constructor?
System.out.println(example.getvalue());
}
}
我所了解到的是,我们需要用于安全的getter/setter,而且它们还可以用于稍后在上对值进行更改或编辑值。
我的问题是,如果构造函数是初始化点,并且总是存在默认构造函数,为什么要使用带参数的构造函数来初始化值,而不是使用getter/setter?。不会使用getter和setter提供安全性,因为它可以在任何阶段轻松地更改值。请为我澄清这一点。
发布于 2013-07-30 17:04:52
默认构造函数始终存在
实际上它并不总是在那里。只有在类中没有定义其他构造函数时,默认构造函数才是由编译器提供的构造函数(当然是无参数构造函数)
为什么我们使用带参数的构造函数来初始化值,而不是使用set get
因为可能存在这样一种情况,即只有在初始化时提供了所有值并且没有缺省值时,才能始终创建对象。因此,必须提供所有值,否则代码将无法编译。
请考虑下面的Book
类
public class Book {
private String title;
private String author;
public Book(String title, String author){
this.title = title;
this.author = author;
}
//getters and setters here
}
考虑这样一种情况:只有在拥有title
和author
的情况下,才能创建图书。
new Book()
,因为没有-arg构造函数,编译器也不会提供,因为已经定义了一个构造函数。new Book()
,因为我们的条件不符合,因为每本书都需要标题和作者。这就是参数化构造函数有用的条件。
发布于 2013-07-30 17:11:58
有时,当创建一个类的新对象时,必须提供一些值。例如,当连接到数据库并创建Connection类对象时,您必须提供一个连接字符串,以便它知道您连接的是什么。在不指定目标数据库的情况下创建新的连接是非常无用的,对吧?
另外,看看这个。
Foo foo=new Foo(1,2,3,4,5,6,7);
还有这个
Foo foo=new Foo();
foo.setP1(1);
foo.setP2(2);
foo.setP3(3);
foo.setP4(4);
foo.setP5(5);
foo.setP6(6);
foo.setP7(7);
第一个看起来更好,对吧?
发布于 2013-07-30 17:10:32
我的问题是,如果构造函数是初始化点,并且默认构造函数总是存在的,那么为什么我们使用带参数的构造函数来初始化值,而不是set
。
如果你考虑一个对象转换成不同的状态,那么有一个参数化的构造函数以及setter和getter是有意义的。让我试着放一个真实的场景:考虑一个Employee类,一个新的employee加入,你不知道太多细节,但很少,你创建Employee对象,并使用其属性的默认值和基值。您需要在系统中注册员工,因此使用了参数化构造函数。获得有关该员工的更多详细信息后,可以使用getter和setter来更新属性。
https://stackoverflow.com/questions/17942580
复制相似问题