2

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

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

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

4

2 回答 2

4

这是嵌套构造函数的好方法。尽管它使这里的代码更短一些,但它容易维护。

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 所建议的那样,构造函数的链可以反转(更少调用更多)。这取决于你想使用什么链。

于 2013-05-05T11:33:06.413 回答
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
}

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

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

于 2013-05-05T11:39:56.127 回答