Java 从另一个构造函数调用一个构造函数而不立即拥有参数

Java Call a Constructor from Another Constructor Without Immediately Having the Parameters

有没有什么方法可以从另一个构造函数调用一个构造函数而不立即获得它的参数?

我 运行 在尝试为我的 SimpleDate class 创建构造函数时遇到了这个问题,该构造函数采用毫秒时间参数并使用另一个构造函数来创建 class(下面的代码)。我 运行 遇到的问题是构造函数调用必须在第一行,但我真的看不到在不首先以毫秒为单位设置时间的情况下获得具有正确时间的 Calendar 实例在前一行。我看不到如何在一行中做到这一点,因为 setTimeInMillis 是一个无效的方法,我认为在调用方法后不可能 return 该值(如果是的话,我会非常也很想知道怎么做)。我意识到这整件事并不是真的完全必要,但我确实想知道这是否可能,如果可能,我会怎么做。

        public SimpleDate(long timeMillis) {
            this(Calendar.getInstance().setTimeInMillis(timeMillis));//Obviously this doesn't work because setTimeInMillis is a void method
        }

        public SimpleDate(Calendar calendar) {
            this.year = calendar.get(Calendar.YEAR);
            this.month = calendar.get(Calendar.MONTH) + 1;
            this.day = calendar.get(Calendar.DAY_OF_MONTH);

            this.hour = calendar.get(Calendar.HOUR_OF_DAY);
            this.minute = calendar.get(Calendar.MINUTE);
            this.second = calendar.get(Calendar.SECOND);
        }

您可以通过调用 class 上的静态方法为您执行必要的转换来完成此操作。

protected static Calendar getCalendarForMillis(long millis) {
    Calender ret = Calendar.getInstance();
    ret.setTimeInMillis(millis);
    return ret;
}

public SimpleDate(long millis) {
    this(getCalendarForMillis(millis));
}

你的问题的答案是否定的:如果参数没有在构造函数的顶部准备好,你就不能在初始化的后面调用另一个构造函数。这就是为什么你必须做一些静态方法的解决方法。

您想要的只是重用从 Calendar 实例创建字段的代码,并能够首先将一个构造函数的 long millis 参数转换为 Calendar 实例。

如果您将 Calendar -> your fields 代码直接放入一个构造函数中,这意味着要重用它,您 必须 调用该构造函数另一个构造函数的第一行。这有点笨拙,因为它迫使您使用单独的静态 millis -> Calendar 方法,该方法可能不会在其他地方使用。

一个更灵活、可以说更简洁的解决方案是将 Calendar -> your fields 代码放在一个单独的方法中,然后从两个构造函数中调用它:

public SimpleDate(Calendar calendar) {
  setDateFields(calendar);        
}

public SimpleDate(long millis) {
  Calendar calendar = Calendar.getInstance();
  calendar.setTimeInMillis(millis);
  setDateFields(calendar);      
}

private void setDateFields(Calendar calendar) {
  this.year = calendar.get(Calendar.YEAR);
  this.month = calendar.get(Calendar.MONTH);
  this.day = calendar.get(Calendar.DAY_OF_MONTH);
  this.hour = calendar.get(Calendar.HOUR_OF_DAY);
  this.minute = calendar.get(Calendar.MINUTE);
  this.second = calendar.get(Calendar.SECOND);
}

这样,您可以在调用任一构造函数中的方法之前进行设置或您喜欢的任何其他操作,我相信这是您真正想要的。