Инкапсуляция данных Java, инициализация и постусловия?

Мое задание - закончить класс Date, показанный ниже. Класс 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);
}
}

2 ответа

Решение

Иметь ввиду! Когда вы звоните date.toString(); вы не конвертируете весь date переменная в String; поскольку это ничего не меняет в объекте, эта строка ничего не делает.

К счастью, это все еще работает, так как, когда вы звоните println(date) с PrintStream объект System.out вы на самом деле называете вариацию println() это занимает Object в качестве параметра вместо того, который принимает String и что это делает, это получить результат параметра toString() метод и печатает это. Таким образом, это точно такой же результат в конце.

Настоящая проблема в вашем методе конструктора. Посмотри внимательно и прочитай. Притворись, что ты - параметр theYear и ваша ценность 2222. В какой момент вы будете использоваться и как?


спойлеры ниже, серьезно иди посмотри


Вы на самом деле никогда не устанавливаете поле myYear ни к чему, если параметр theYear является недействительным! Лучшее решение здесь - добавить недостающее else пункт после проверки theYear чтобы соответствовать вашей обработке остальных параметров.

Вам нужно исправить свою реализацию в нескольких местах:

  • Поскольку вы изучаете инкапсуляцию, вы должны объявить свои переменные 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;
}
Другие вопросы по тегам