0

我的任务是完成如下所示的日期课程。Date 类通过将月、日和年存储在私有实例变量中来封装日期。

  public class Date
  {
  // declare your instance variables here
  // postcondition: instance variables are initialized with any valid values
  // you choose
  public Date ()
  {

  }
  // postcondition: instance variables are initialized with the given values if they are valid
  // the month instance variable should be between 1-12
  // the day instance variable should be between 1-31
  // if the parameters are not valid, the instance variables are given different values that are valid
  public Date(int theMonth, int theDay, int theYear)
  {
  }
  // postcondition: returns a String in the form month/day/year
  public String toString()
  {
  }
}

下面的代码是我到目前为止所拥有的。坦率地说,我对我应该做什么感到很困惑,而且我没有教练可以问。输出为“ 2/2/0 ”

编辑更新:如果我输入一个无效的年份,例如 200,它不会打印错误消息......我使用 if 语句的目的是捕捉年份不是 4 位数的错误。它是否正确?感谢您的任何帮助!

public class Date
{
// declare your instance variables here
private int myMonth;
private int myDay; 
private int myYear;
// postcondition: instance variables are initialized with any valid values

// you choose
public Date ()
{
    myMonth = 11;
    myDay = 11;
    myYear = 2011;
}
// postcondition: instance variables are initialized with the given values if they are valid
// the month instance variable should be between 1-12
// the day instance variable should be between 1-31
// if the parameters are not valid, the instance variables are given different values that are valid
public Date(int theMonth, int theDay, int theYear)
{
   if ( theMonth >= 1 && theMonth <= 12 ) {
       myMonth = theMonth;
   }
   else {
       System.out.print("Month Value invalid; default to 1");
       myMonth = 1;
   }
   if( theDay >= 1 && theDay <= 31 ) {
       myDay = theDay;
   }
   else {
       System.out.print("Day Value invalid; default to 1");
       myDay = 1;
   }
   if( theYear < 4 ) {
       System.out.print("Year Value invalid; default to 2000");
       myYear = 2000;
   }
   else {
   myYear = theYear;
   }
}
   // postcondition: returns a String in the form month/day/year
public String toString()
{
    return myMonth + "/" + myDay + "/" + myYear;
}

public static void main(String [] args)
{
    int theMonth, theDay, theYear;
    theMonth = 2;
    theDay = 2;
    theYear = 200;
    Date date = new Date(theMonth, theDay, theYear);
    date.toString();
    System.out.println(date);
}
}
4

2 回答 2

3

您需要在几个地方修复您的实现:

  • 由于您正在学习封装,因此您应该声明变量private
  • 假设你的类中没有其他方法,你还应该声明你的变量final
  • 没有规则要求验证年份,所以if条件需要去;年度分配需要是无条件的

这应该解决打印零而不是年份的问题。

注意:(如果您还没有研究过异常,请跳过这里)处理确保构造函数中的后置条件的常用方法是在参数无效时抛出异常,而不是试图猜测这些参数应该是什么。IllegalArgumentException当您检测到其中一个参数无效时,请考虑抛出:

public Date(int theMonth, int theDay, int theYear)
{
   if ( theMonth < 1 || theMonth > 12 ) {
       throw new IllegalArgumentException("month");
   }
   if( theDay < 1 || theDay > 31 ) {
       throw new IllegalArgumentException("day");
   }
   myMonth = theMonth;
   myDay = theDay;
   myYear = theYear;
}
于 2013-12-13T20:47:48.547 回答
1

记住!当您打电话时,date.toString();您不会整个date变量转换为String; 因为这实际上并没有改变对象中的任何内容,所以该行什么也不做。

幸运的是,它仍然有效,因为当您println(date)使用PrintStreamobject调用时System.out,您实际上是在调用接受 a 作为参数的变体,println()Object不是接受 a 作为参数的变体String所做的是获取参数toString()方法的结果并打印出来。所以,最后的结果是一样的。

真正的问题在于您的构造方法。仔细看,通读一遍。假设您是参数theYear,您的值为 2222。您将在什么时候使用,以及如何使用?


以下剧透,认真去看


实际上,除非参数无效,否则您永远不会将字段设置myYear任何值!theYear最好的解决方案是在您检查以匹配您对其余参数的处理else之后添加该缺失的子句。theYear

于 2013-12-13T20:49:28.990 回答