在进行构造函数重载时,我遇到了一个名为“一致构造函数”的东西。我理解构造函数重载是什么。
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
,因为我在其中一个构造函数中显示初始化实例变量....在我的例子中总是有两个参数的构造函数被调用!
Java中这些一致的构造函数是什么?
这些实际应用是什么?
为什么在Java中使用它们?
有关理解此主题的更多信息?
有人可以通过外行术语为像我这样的菜鸟提供更多关于此话题的解释,并了解更多有关此主题的信息吗?
答案 0 :(得分: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);
从另一个构建函数调用,构造函数的主要逻辑可以只在一个地方维护,即a good thing。
为什么在Java中使用它们?
与其他语言不同,Java不支持可选参数。在某些语言中,您可以像这样编写构造函数:
Person(String N, String C=null) {
Name=N;
City=C;
}
在这种情况下,只有一个构造函数,可以使用1或2个参数调用,如果未指定,则城市默认为null。这不是有效的Java,但可以通过重载伪造它。
答案 1 :(得分: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, "
仅作为参数传递给单个案例。当这是一个真实的项目而{100}在其他地方使用foo
时,你可以这样做:
foo(a){
foo("Hello", a);
}
foo(greeting, name){
System.out.println(greeting +", " + name);
}
有些IDE支持这作为重构,所以它可以是一种非常方便的技术。
答案 2 :(得分: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");
不一致的地方在哪里?您希望人数#2和#3(p2
,p3
)的年龄未定义,即其值为-1
,0
或{{ 1}}。只要使用null
和Person(String, String)
为您提供相同的一致值,无论哪一个都无关紧要。
在此示例中,第二个构造函数将Person(String
初始化为age
,但第三个构造函数将此属性初始化为0
- 这似乎非常不一致。