首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java :Setter、Getter和构造器

Java :Setter、Getter和构造器
EN

Stack Overflow用户
提问于 2013-07-30 17:00:51
回答 11查看 86.7K关注 0票数 27

我对getter/setter和构造函数的用法有点困惑(参见下面的示例代码)

代码语言:javascript
复制
    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提供安全性,因为它可以在任何阶段轻松地更改值。请为我澄清这一点。

EN

回答 11

Stack Overflow用户

发布于 2013-07-30 17:04:52

默认构造函数始终存在

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

为什么我们使用带参数的构造函数来初始化值,而不是使用set get

因为可能存在这样一种情况,即只有在初始化时提供了所有值并且没有缺省值时,才能始终创建对象。因此,必须提供所有值,否则代码将无法编译。

请考虑下面的Book

代码语言:javascript
复制
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的情况下,才能创建图书。

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

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

票数 26
EN

Stack Overflow用户

发布于 2013-07-30 17:11:58

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

另外,看看这个。

代码语言:javascript
复制
Foo foo=new Foo(1,2,3,4,5,6,7);

还有这个

代码语言:javascript
复制
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);

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

票数 10
EN

Stack Overflow用户

发布于 2013-07-30 17:10:32

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

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

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17942580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档