Java:Setter Getter和构造函数

Jav*_*ent 23 java getter setter constructor class

我对使用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());
        }
   }
Run Code Online (Sandbox Code Playgroud)

我所学到的只是我们需要getter/setter来保证安全性,以及以后它们也可以用来更改或编辑值.

我的问题是,如果构造函数是初始化点并且始终存在默认构造函数,为什么使用带参数构造函数来初始化值而不是getters/setter?.不会使用getter和setter提供安全性,并且能够在任何阶段轻松更改值.请为我澄清这一点.

Pra*_*kar 24

默认构造函数总是在那里

实际上它并不总是存在.默认构造函数是由编译器提供的构造函数(当然它是一个无参数构造函数)只有在类中没有定义其他构造函数的情况下

为什么我们使用带参数的构造函数初始化值而不是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 
}
Run Code Online (Sandbox Code Playgroud)

考虑一种情况,即只有拥有title和才能创建一本书author.

  • 你不能这样做,new Book()因为缺少no-arg构造函数,编译器不会提供一个,因为已经定义了一个构造函数.
  • 你也做不到new Book()因为我们的条件不符合,因为每本书都需要一个标题和作者.

这是参数化构造函数有用的条件.


小智 9

有时,在创建类的新对象时,必须提供一些值.例如,当连接到数据库并创建Connection类对象时,您必须提供连接字符串,以便它知道您要连接到什么.在没有指定目标数据库的情况下创建新连接将毫无用处,对吧?

另外,看看这个

Foo foo=new Foo(1,2,3,4,5,6,7);
Run Code Online (Sandbox Code Playgroud)

还有这个

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);
Run Code Online (Sandbox Code Playgroud)

第一个看起来更好,对吧?


Jun*_*san 6

我的问题是,如果构造函数是初始化点,默认构造函数总是存在,那么为什么我们使用带参数的构造函数来初始化值而不是set get.

如果你考虑一个对象转换到不同的状态,那么有一个参数化的构造函数以及setter和getter是有意义的.让我尝试一个现实生活场景:想想一个Employee类,一个新员工加入,你不知道很多细节,但很少,你创建了Employee的对象,其属性的defualt和基值.您需要在系统中注册员工,因此您使用了参数化构造函数.获得有关员工的更多详细信息后,可以使用getter和setter来更新属性.


Ank*_*kit 5

这纯粹取决于你的编码风格.但IMO,我会使用参数化构造函数:

  1. 初始化那些不应该更改的值.(如person对象的username参数)

  2. 要初始化这些值,而不设置哪个,对象将处于无效状态.

比如说,您正在向方法发送登录参数.你可以在这些方面使用

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");
Run Code Online (Sandbox Code Playgroud)

虽然您可以在第一种情况下设置用户名后立即发送登录对象,但在收到结束时它将无效.但第二种方法不容易出现错误,bcz必须传递所有必需的参数.


tbo*_*odt 2

只是为了让事情变得更容易。使用构造函数比创建对象并使用 setter 所需的代码更少。