1

在进行构造函数重载时,我遇到了一种叫做“一致构造函数”的东西。我了解构造函数重载的全部内容。

Class Person
{
  String Name;
  String City;

  Person(String N,String C)
  {
    Name=N;
    City=C;
  }

  Person(String N)
  {
    this(N,NULL);
  }
}

Class NewClass
{
  public static void main(String[] args)
  {
    Person obj1=new Person("carl","max");
    Person obj2=new Person("Tommy");
  }
}

根据我的说法是一个一致的构造函数::它使用this我在一个构造函数中显示来初始化实例变量......在我的例子中,总是调用带有两个参数的构造函数!


  1. Java 中的这些一致构造函数是什么?

  2. 这些有什么实际应用?

  3. 为什么在 Java 中使用它们?

  4. 有关理解此主题的更多信息吗?

有人可以用外行术语为像我这样的菜鸟提供更多关于这个主题的解释,并提供更多信息来了解这个主题吗?

4

3 回答 3

2

我从未听说过它被称为“一致的构造函数”。我想我听说过它叫做“链式构造函数调用”。当您使用this来自一个构造函数的关键字来调用不同的构造函数时。

这些有什么实际应用?

它们减少了代码重复,从而提高了可维护性。想象一下,“Name=N”代码在每个构造函数中都重复了:

Person(String N,String C)
{
  Name=N;
  City=C;
}

Person(String N)
{
  Name=N;
  City=null;
}

现在假设我们要验证名称:

Person(String N,String C)
{
  if (N == null || N.length() == 0) throw new IllegalArgumentException();
  Name=N;
  City=C;
}

Person(String N)
{
  Name=N;
  City=null;
}

我们更改了一个构造函数,但忘记了另一个,因此可以绕过名称限制。如果类非常复杂,这是一个真正的风险。

通过this(N,null);从另一个构造函数调用一个构造函数,构造函数的主要逻辑可以保持在一个地方,这是一件好事

为什么在 Java 中使用它们?

与其他一些语言不同,Java 不支持可选参数。在某些语言中,您可能会这样编写构造函数:

Person(String N, String C=null) {
  Name=N;
  City=C;
}

在这种情况下,只有一个构造函数,可以使用 1 个或 2 个参数调用,如果未指定,城市默认为 null。这不是有效的 Java,但可以通过重载来伪造它。

于 2013-11-30T15:26:07.807 回答
2

这是我经常使用的一种很好的技术,但我不知道它的名称。它也可以应用于重载方法。主要好处是您有多个输入案例的单一逻辑,并且您提供默认值以简化其使用。即您有一个带有完整签名的方法,例如:

foo(a, b, c, d) {...}

而且很长。这可能是一种代码异味——即将这些参数组合成一个或两个参数对象或组合成一个实例状态可能会更好。无论如何,有这个签名可能是有原因的,所以为了简化这个方法的使用,可以提供一个签名,用默认值调用它:

foo(a, b){
    return foo(a, b, defaultC, defaultD);
}

反向案例

您有一个foo(a)要参数化的方法:

foo(name){
    System.out.println("Hello, " + name);
}

"Hello, "并且您只需要为单个案例作为参数传递。当这是一个真实的项目并foo在其他 100 个地方使用时,您可以这样做:

foo(a){
    foo("Hello", a);
}

foo(greeting, name){
    System.out.println(greeting +", " + name);
}

一些 IDE 支持将此作为重构,因此它可能是一种非常方便的技术。

于 2013-11-30T15:28:41.703 回答
2

我从未听说过一致的构造函数,但我想这是关于由不同构造函数初始化的参数。让我们看看不一致的构造函数是什么样子的:

class Person {
    String firstName;
    String lastName;
    Integer age;

    Person(String firstName, String lastName, Integer age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    Person(String firstName, String lastName) {
        this(firstName, lastName, 0);
    }

    Person(String firstName) {
        this(firstName, null, null);
    }
}

Person p1 = new Person("Joe", "Doe", 24);
Person p2 = new Person("Joe", "Doe");
Person p3 = new Person("Joe");

哪里不一致?p2您会期望 #2 和 #3 ( , )的年龄p3未定义,即其值为-1,0null。只要使用哪一个都没有关系,Person(String, String)并且Person(String会给你相同的、一致的价值。

在此示例中,第二个构造函数初始化age0,但第三个构造函数将此属性初始化为null- 这似乎很不一致。

于 2013-11-30T15:36:53.273 回答