Инкапсуляция данных 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;
}