2013-12-13 2 views
0

Мое задание состоит в том, чтобы завершить класс Date, показанный ниже. Класс Date инкапсулирует дату, сохраняя месяц, день и год в переменных частного экземпляра.Инкапсуляция, инициализация и постусловия данных Java?

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»

EDIT UPDATE: Если я ввел год, который недействителен, например, 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

В чем проблема? –

+2

Вы никогда не устанавливаете значение 'myYear' в значение 'Year' в вашем конструкторе, если оно' = = 4'. Это должно быть 'if (theear <4) { System.out.print (« Значение года недействительно, по умолчанию 2000 »); myYear = 2000; } else { \t myYear = theYear; } ' –

+1

Требования к послесловию не требуют проверки на год, поэтому вам не нужно проверять, составляет ли это четыре цифры или больше. – dasblinkenlight

ответ

1

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

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

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


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


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

+0

Спасибо! Ваше описание того, что происходит с PrintStream, было очень информативным. Я добавил этот оператор else, так что это исправлено :) Но если я введу год, который недействителен, например, 200, он не выводит сообщение об ошибке ... Мое намерение с помощью оператора if заключалось в том, чтобы ловить ошибки, год не 4 цифры. Это верно? –

+0

@ReneaS. Ах! Фактически то, что вы делаете, это проверка того, будет ли год меньше 4. Как и в случае с фактическим номером 4. Если бы это было 5, то он чувствовал бы, что год абсолютно прекрасен, но если бы он был 2 или -394, он заменил бы его , То, что вы хотите проверить, - это если 'theYear' - это 4-значное число ... то есть любое число между 1000 и 9999. Итак, просто замените' theYear <4' 'theYear <1000 || theYear> 9999' или любой другой диапазон. – Mumbleskates

+0

хорошо! Не могли бы вы немного объяснить, но почему вы использовали OR вместо AND? –

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

Скорее всего, Ренеа еще не находится в точке, где они узнают об Исключениях и стандартной практике. Назначение, скорее всего, требует от них установки значений по умолчанию, поэтому я бы не стал об этом беспокоиться. – Mumbleskates

+0

@Widdershins. Это справедливое наблюдение, я добавил примечание, в котором OP игнорирует примечание об исключениях, если они еще не изучили эту тему. – dasblinkenlight

+0

У нас нет, но спасибо за понимание! –