速记类构造函数字段初始化

时间:2013-05-05 11:30:56

标签: java

我不禁觉得有一种简写方法可以写出这样的东西:

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;
    }
}

是否可以更“紧凑”地写这个?

2 个答案:

答案 0 :(得分:3)

这是嵌套构造函数的好方法。虽然它使这里的代码只有一点点,但它使 更容易维护。

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建议的那样,构造函数的链可以反转(减少调用次数)。这取决于您想要使用的链条。

答案 1 :(得分:3)

你应该将构造函数链接在一起:我认为从带有最少参数的构造函数链接到指定所有的构造函数是个好主意:

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
}

这样,所有构造函数最终都会通过一个“master”构造函数,这是唯一设置字段的地方。我发现这比whoAmI的答案风格更容易理解,每个构造函数只设置一些字段。它还可以更容易地查看默认值,因为它们是在链接构造函数调用中指定的。

另请注意,我已将字段设为私有(并根据Java命名约定命名)。我还在构造函数final中设置了字段 - 如果可以使您的类完全不可变,那么在推理它们时这很有帮助。对于包含许多字段的类,您可能需要考虑使用构建器模式,在可设置的构建器上设置属性,然后从中构建不可变对象。