Java :Setter Getter and constructor

2022-09-01 12:48:02

我对 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 来确保安全性,并且它们也可用于以后更改或编辑值

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


答案 1

默认构造函数始终存在

实际上它并不总是在那里。默认构造函数是由编译器提供的构造函数(当然它是无参数构造函数),仅当类中没有定义其他构造函数时

为什么我们使用带有参数的构造函数来初始化值而不是设置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 
}

考虑这样一个条件:只有当书籍具有 和 时,才能创建书籍。titleauthor

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

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


答案 2

有时,在创建类的新对象时,必须提供一些值。例如,在连接到数据库并创建 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);

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