2015-07-04 68 views
4

是否有任何方法可以从另一个构造函数调用构造函数而不立即拥有参数?Java从另一个构造函数调用构造函数而不立即拥有参数

我碰到了这个问题,同时试图为我的SimpleDate类创建一个构造函数,该类使用了毫秒时间参数,并使用另一个构造函数创建类(以下代码)。我碰到的问题是,构造函数调用必须在第一行,但我真的不知道如何在没有首先在前一行中设置以毫秒为单位的时间的情况下正确地获取Calendar实例。我不明白这是怎么一回事,因为setTimeInMillis是一个无效的方法,我不认为它可能在调用方法后返回值(如果它是比我想知道如何以及) 。我意识到这件事并非完全必要,但我想知道这是否可能,如果是,我该怎么做。

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

回答

2

您可以通过调用该类的静态方法来为您执行必要的转换。

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

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

的回答你的问题是否定的:你不能再打另一个构造在初始化如果参数不是在构造顶部准备正确的。这就是为什么你必须做一些静态方法的解决方法。

+0

谢谢!我想这不像我希望的那样是一个很好的解决方案,但它工作得很好。 – kmecpp

1

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

如果你把Calendar - >your fields代码直接到一个构造函数,这意味着重新使用它,你来调用构造函数在其他构造的第一道防线。这有点笨拙,因为它会强制你使用单独的静态方法,这可能不会在其他地方使用。

更灵活,可以说是清洁的解决方案是只把那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); 
} 

这样一来,你可以做设置,或在任何构造函数中调用该方法之前,您都喜欢的其他任何东西,我相信这是您真正想要的。

+0

我知道发布这样的问题,有更简单的方法去做这件事,我真的只是想知道是否有可能这样做。你的方法确实达到了同样的效果。 – kmecpp

相关问题