Java:Setter、Getter和构造函数
我对getter/setter和构造函数的使用有点困惑(参见下面的代码示例) 我所学到的是,我们需要安全性的getter/setter,它们也可以用于以后更改或编辑值Java:Setter、Getter和构造函数,java,class,constructor,setter,getter,Java,Class,Constructor,Setter,Getter,我对getter/setter和构造函数的使用有点困惑(参见下面的代码示例) 我所学到的是,我们需要安全性的getter/setter,它们也可以用于以后更改或编辑值 我的问题是,如果构造函数是初始化点,并且始终存在默认构造函数,那么为什么要使用带有参数的构造函数来初始化值,而不是使用getter/setter?。使用getter和setter是否能够提供安全性以及在任何阶段轻松更改值。请为我澄清这一点 只是为了让它更简单。与创建对象和使用setter相比,使用构造函数所需的代码更少。这完全取决
我的问题是,如果构造函数是初始化点,并且始终存在默认构造函数,那么为什么要使用带有参数的构造函数来初始化值,而不是使用getter/setter?。使用getter和setter是否能够提供安全性以及在任何阶段轻松更改值。请为我澄清这一点 只是为了让它更简单。与创建对象和使用setter相比,使用构造函数所需的代码更少。这完全取决于您的编码风格。但在我看来,我会使用参数化构造函数:
Login obj = new Login();
obj.setUsername("user");
obj.setPassword("pw")// what if someone commented this out, or you forget to call it
and otherway,
Login obj = new Login("user", "pw");
在第一种情况下,您可以在设置用户名之后发送登录对象,但在接收端它将无效。但是第二种方法不太容易出现错误,因此有必要传递所有必需的参数
默认构造函数始终存在
事实上,它并不总是在那里。只有在类中没有定义其他构造函数时,默认构造函数才是由编译器提供的构造函数(当然它是无参数构造函数)
为什么我们使用带参数的构造函数来初始化值而不是set-get
因为可能存在这样一种情况,即只有在初始化时提供了所有值并且没有默认值时,才能始终创建对象。所以必须提供所有值,否则代码将无法编译
考虑一下这本书
类
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
}
考虑这样一种情况:一本书只有在有标题
和作者
的情况下才能创建
- 您不能执行
,因为没有缺少参数构造函数,并且编译器不会提供参数构造函数,因为已经定义了一个构造函数李>newbook()
- 此外,您不能执行新书(),因为我们的条件不符合,因为每本书都需要一个标题和作者
这是参数化构造函数有用的条件。通过构造函数初始化对象变量以避免空指针更容易、更安全 如果您在没有首先初始化变量的情况下实例化了对象,并且对其中一个空变量执行了get操作,那么在运行时可能会出现null指针异常,因为您忘记手动设置其值 另一方面,如果总是在默认构造函数中初始化对象变量,则在运行时获得nullpointer异常的风险会大大降低,因为除非通过setter(不推荐)专门设置变量,否则任何变量都不能为null 我的问题是,若构造函数是初始化点和 默认构造函数总是存在的,所以为什么我们使用 参数来初始化值,而不是设置get
如果您考虑一个对象转换成不同的状态,那么有一个参数化的构造函数以及setter和getter是有意义的。让我试着放一个真实的场景:考虑一个Employee类,一个新的Employee加入,您不知道很多细节,但知道的很少,您创建了Employee的对象,该对象具有default及其属性的基本值。您需要在系统中注册员工,因此使用参数化构造函数。一旦获得有关员工的更多详细信息,就可以使用getter和setter来更新属性。有时不需要在创建时将所有字段设置为特定值。例如,在创建数组时。另外,正如前面所说的,当您使用getter时更安全——您无法获取null指针
当您使用参数定义构造函数时,请记住编写默认构造函数。或者一定不要使用它。有时,在创建类的新对象时,必须提供一些值。例如,当连接到数据库并创建连接类对象时,您必须提供一个连接字符串,以便它知道您要连接到什么。在不指定目标数据库的情况下创建新连接将非常无用,对吗 还有,看看这个
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);
第一个看起来更好,对吗?带参数的构造函数使您完全构造对象。如果要使用默认设置,则必须确保使用setter设置字段。在设置某些属性的过程中,假设抛出了异常,现在您有了一个不可用的对象。在一些情况下,setter不会被暴露,而是getter。在这些情况下,使用带参数的构造函数或命名构造函数是正确的选择。简而言之,getter和setter确实有它们自己的重要性,而不是初始化对象
因为在构造函数中将值设置为参数时,使用的代码更少、更优雅、可读性更好。此外,有时某些字段对于对象是必不可少的,因此参数构造函数可以防止用户创建对象时忽略对象功能所需的字段。一种方法虽然没有“强制”调用Setter。首先,构造函数和Setter这两种方法都是更改对象属性的安全方法。需要类作者公开或不安全的方法来修改实例
// Example of a Class with a Default Constructor
public class GetSet {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public static void main(String[] args) {
// Theres a implicit Default Constructor here
// Its ok to do that
// GetSet obj = new GetSet();
GetSet obj = new GetSet();
}
}
// Example of a Class without a Default Constructor
public class GetSet2 {
public GetSet2(String value) {
this.value = value;
}
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public static void main(String[] args) {
// GetSet2 obj = new GetSet2(); // compile time error
// Default constructor is not provided, since u wrote one
}
}
2.关于哪一个更好:使用常量
// Example of a Class with a Default Constructor
public class GetSet {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public static void main(String[] args) {
// Theres a implicit Default Constructor here
// Its ok to do that
// GetSet obj = new GetSet();
GetSet obj = new GetSet();
}
}
// Example of a Class without a Default Constructor
public class GetSet2 {
public GetSet2(String value) {
this.value = value;
}
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public static void main(String[] args) {
// GetSet2 obj = new GetSet2(); // compile time error
// Default constructor is not provided, since u wrote one
}
}
// Example of modifing an obj via Setter and Constructor
public class GetSet3 {
public GetSet3(String value1, String value2, String value3, String value4) {
this.value1 = value1;
this.value2 = value2;
this.value3 = value3;
this.value4 = value4;
}
private String value1;
private String value2;
private String value3;
private String value4;
// ... Getters and Setters
public static void main(String[] args) {
// Its easier to this
GetSet3 obj;
obj= new GetSet3("j", "a", "v", "a");
// instead that
// its also easy to forget or do something wrong
// when u have a lot of attributes to set
obj.setValue1("j");
obj.setValue2("a");
obj.setValue3("v");
obj.setValue4("a");
}
}