Java 速记类构造函数字段初始化
我忍不住觉得有一种速记方法可以写这样的东西:Java 速记类构造函数字段初始化,java,Java,我忍不住觉得有一种速记方法可以写这样的东西: public abstract class MessageBase { public String Destination, Sender = "", Uid = ""; public MessageBase(String destination) { this.Destination = destination; } public MessageBase(String destinatio
public abstract class MessageBase
{
public String Destination, Sender = "", Uid = "";
public MessageBase(String destination)
{
this.Destination = destination;
}
public MessageBase(String destination, String uid)
{
this.Destination = destination;
this.Uid = uid;
}
}
有没有可能写得更“紧凑”?这是一种很好的嵌套构造函数方法。虽然它使这里的代码只短了一点,但它使它更易于维护
public String destination;
public sender = "";
public uid = "";
public MessageBase(String destination){
this.destination = destination;
}
public MessageBase(String destination, String uid){
this(destination);
this.uid= uid;
}
您应该将变量名更改为以小写字母开头
我通常每行只声明一个变量
正如@Jon Skeet所建议的,构造函数的链可以反转(调用越少,调用越多)。这取决于您想要使用什么链。这是一种很好的嵌套构造函数方法。虽然它使这里的代码只短了一点,但它使它更易于维护
public String destination;
public sender = "";
public uid = "";
public MessageBase(String destination){
this.destination = destination;
}
public MessageBase(String destination, String uid){
this(destination);
this.uid= uid;
}
您应该将变量名更改为以小写字母开头
我通常每行只声明一个变量
正如@Jon Skeet所建议的,构造函数的链可以反转(调用越少,调用越多)。由您决定要使用什么链。您应该将构造函数链接在一起:我认为最好将参数最少的构造函数链接到所有指定的构造函数:
public abstract class MessageBase {
private final String destination;
private final String uid;
private String sender;
public MessageBase(String destination) {
// Invoke the more parameterized constructor
this(destination, "");
}
public MessageBase(String destination, String uid) {
this.destination = destination;
this.uid = uid;
}
public void setSender(String sender) {
this.sender = sender;
}
// etc
}
这样,所有构造函数最终都要经过一个“主”构造函数,这是唯一设置字段的地方。我发现这比whoAmI的答案更容易理解,whoAmI的答案是每个构造函数只设置一些字段。它还可以更容易地查看默认值,因为它们是在链接构造函数调用中指定的
还请注意,我已将字段设置为私有字段(并根据Java命名约定对其进行命名)。我还将构造函数中设置的字段设置为final-如果可以使类完全不可变,那么在对它们进行推理时,这将非常有用。对于具有多个字段的类,您可能需要考虑使用Builder模式,其中在可更改的生成器上设置属性,然后从中建立一个不可变的对象。
您应该将构造函数链接在一起:我认为从一个具有最少参数的构造函数链接到一个具有指定内容的构造函数是一个好主意:
public abstract class MessageBase {
private final String destination;
private final String uid;
private String sender;
public MessageBase(String destination) {
// Invoke the more parameterized constructor
this(destination, "");
}
public MessageBase(String destination, String uid) {
this.destination = destination;
this.uid = uid;
}
public void setSender(String sender) {
this.sender = sender;
}
// etc
}
这样,所有构造函数最终都要经过一个“主”构造函数,这是唯一设置字段的地方。我发现这比whoAmI的答案更容易理解,whoAmI的答案是每个构造函数只设置一些字段。它还可以更容易地查看默认值,因为它们是在链接构造函数调用中指定的
还请注意,我已将字段设置为私有字段(并根据Java命名约定对其进行命名)。我还将构造函数中设置的字段设置为final-如果可以使类完全不可变,那么在对它们进行推理时,这将非常有用。对于具有多个字段的类,您可能需要考虑使用Builder模式,其中在可更改的生成器上设置属性,然后从中创建不可变的对象。 <代码> Test.List=目标;code>当两个属性的大小写相同时,它只需要
这个
。说到这里,这个属性应该都是小写的。请学习类、方法和属性名称的通用(特别是用于名称的大小写),并一致使用。否。此外,以大写字母开头的成员变量是不典型的,而且令人困惑{与class/constructor/function一样在同一行中。您可以在那里保存3行。this.Destination=Destination;
当两个属性的大小写相同时,它只需要this
。说到这一点,该属性应该都是小写的。请学习common(特别是用于名称的大小写)对于类、方法和属性名称,请一致使用。否。此外,以大写字母开头成员变量是不典型的,而且容易混淆。我将编写{与类/构造函数/函数在同一行中。您可以在那里保存3行。有关另一种方法,请参阅我的答案,其中链接从单参数版本到多参数版本。@Jon Skeet我编辑了我的,以添加此选项。与我的相比,您发现这种方法有哪些优点?我在回答中解释:这是一种指定所有字段的一个地方,而不是试图在多个地方找到它,显然设置默认值。如果有几个构造函数,指定不同的字段集合,这一点尤其重要。(无可否认,在这一点上,您应该考虑重新设计该类型……)@Jon Skeet我认为您的方法更容易理解,尽管我认为查找默认值更难(特别是如果它是在其他地方声明的全局字段)。我将保留我的答案以供其他意见,并让OP决定。Thanx供您审阅!请参阅我的答案以了解替代方法,即从单参数版本链接到多参数版本。@Jon Skeet我编辑了我的答案以添加此选项。与我的相比,您发现这种方法有哪些优点?我在回答中解释:这是一种指定所有字段的一个地方,而不是试图在多个地方找到它,显然设置默认值。如果有几个构造函数,指定不同的字段集合,这一点尤其重要。(无可否认,在这一点上,您应该考虑重新设计该类型……)@Jon Skeet我认为您的方法更容易理解,尽管我认为查找默认值更难(特别是如果它是在其他地方声明的全局字段)。我将保留我的答案以供其他意见,并让OP决定。Thanx供您审阅!我喜欢您对构造函数的想法。我不相信我可以使这个类不可变,因为我将使用json库来转换它,并从json转换过来……出于这个原因,我认为我不会在这里使用生成器模式。我喜欢您对构造函数的想法我不相信我能使这个类不可变,因为我将使用一个json库来转换它,并从json转换过来…为了这个原因