【问题标题】:Java class with no constructor?没有构造函数的Java类?
【发布时间】:2014-03-05 23:49:46
【问题描述】:

我有这门课

class Customer{
    int ID;
    Time arriveTime;
    Time serviceTime;
    Time completeTime;
    int transaction;
}

我不需要构造函数来设置里面的值吗?我将使用这个类来保存不同的值,同时制作一个客户数组。这是否意味着我需要这个来设置值?

public Customer(int id, Time arrive, Time service, Time complete, int trans){
            ID = id;
            arriveTime = arrive;
            serviceTime = service;
            completeTime = complete;
            transaction = trans;
}

我只需要 Customer 类来保存每个客户的信息。

【问题讨论】:

  • 除非您指定 some 构造函数,Java 提供了一个隐式的无参数构造函数,它只是将所有内容设置为零。
  • 请注意,以上内容完全合法地等效于 C/C++“结构”——一个不完全的对象,它将数据项组合在一起而不封装它们。并非所有情况都需要封装——有时这只是额外的工作。

标签: java class constructor


【解决方案1】:

不一定,因为默认情况下,没有可见性修饰符的属性(值)可以直接在同一包中的代码中的 Customer 实例上设置。

例如:

Customer c = new Customer(); // default constructor 
c.ID = 5;
... (etc.)

更多关于modifier access levels here

【讨论】:

    【解决方案2】:

    可以从类外部设置字段,这意味着您可以使用另一个类来设置值。

    然而,构造函数确实是一种更方便的方法,并且可以屏蔽另一个类对字段的操作(由一些可能会干扰预期功能的程序员实现)。

    如果只实现一个类来存储记录,您可以创建字段privatefinal 并实现适当的getter。

    【讨论】:

      【解决方案3】:

      您根本没有定义构造函数,因此将为您添加默认构造函数。但是,它不会设置任何这些字段,所以你必须去:

      Customer c = new Customer();
      c.ID = 34
      

      等等。有几点:

      • 您没有声明访问修饰符,因此同一个包中的类可以调用c.ID,但其他类不能。您可能希望将它们公开
      • 但是,如果您创建一个 getter 和 setter 方法而不是授予对您的字段的访问权限,那可能会更好。这样,您将来可以在不更改界面的情况下更改字段

      【讨论】:

        【解决方案4】:

        您建议的方法在抽象和分离变量方面做得不是很好。它允许它们被任何代码随意弄乱。

        Java 的一部分是 OOP,即面向对象编程。如果您将类的某些部分设为private 并与其余代码分开,那么它将限制其他代码的访问,这有助于您的类遵循封装的OO原则。

        相反,我会创建一个在适当时填充字段的构造函数,例如arriveid。我会让变量private。另外,我会将id 设为静态成员,因为它会随着每个新客户而增加。

        【讨论】:

          【解决方案5】:

          是的,您需要一个构造函数在对象创建期间为您的类分配参数,或者您可以通过实例单独引用每个变量并分配它,例如:

           Customer c = new Customer();
           c.id = 0;
           // etc
          

          构造函数只是使这更容易,因为您不需要编写不必要的代码。

          我确实建议使用构造函数为类实例分配各种值,而不是每次创建对象实例时手动执行。

          【讨论】:

          • 构造函数如何使它更容易?
          • 因此,您不必在每次创建对象实例时分配各种参数,而是由构造函数执行。节省您编写代码的时间。
          • 那么写new Fred(a, b, b)new Fred(); instance.a = a; instance.b = b; instance.c = c;的真正区别是什么?是的,您节省了大约 3 打字符的输入,但在大多数情况下,这只是小数目。
          • 我并不是说代码的结果存在差异,我是说使用构造函数而不是单独分配字段更容易,尤其是当您需要创建许多实例时一个对象,有许多需要不同的参数。
          • 很抱歉,我没有看到任何显着差异。事实上,如果必须以某种方式计算要分配的值,那么将分配放在不同的行上是有利的。
          猜你喜欢
          • 1970-01-01
          • 2011-04-09
          • 1970-01-01
          • 2023-03-12
          • 2012-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多