Ява практике вопросы экзамена


Делаешь практика вопросы для Java экзамен, на которые нет ответов (полезно) меня попросили сделать следующее:

Написать класс с именем человека, с учетом следующих особенностей:

  • в частный int назвать возраст;
  • в частной строка называется имя;
  • конструктор со строковым аргументом, который инициализирует имя на полученное значение и возраста до 0;
  • открытый метод метод toString(логическое полный). Если полный это правда, то метод возвращает строку, состоящую из имени человека с последующим их возраст в скобках; если полной является ложной, метод возвращает строку, состоящую из просто имя. Например, возвращаемая строка может быть Сью (21) или подать в суд;
  • открытый метод incrementAge(), которая инкрементирует возраст и возвращает новый возраст;
  • открытый метод canVote() , которая возвращает значение true, если возраст составляет 18 или более, и значение false в противном случае.

Мой код выглядит следующим образом кто-нибудь может указать на ошибки?

public class Person
{
    private int age;
    private String name;

    public Person(String st)
    {
      name = st;
      age = 0;
    }

   public String toString(boolean full)
   {
     if(full == true)
     {
        return name + "(" + age + ")";
     }
     else
     {
        return name;
     }
   }

   public int incrementAge()
   {
      age++;
      return age;
   }

   public boolean canVote()
   {
     if(age >= 18)
     {
        return true;
     }
     else
     {
        return false;
     }
   }
}


1390
11
задан 30 мая 2011 в 02:05 Источник Поделиться
Комментарии
14 ответов

вместо

if(full == true)

использовать

if (full)

и вместо того, чтобы

if(age >= 18)
{
return true;
}
else
{
return false;
}

использование:

return age >= 18

14
ответ дан 30 мая 2011 в 02:05 Источник Поделиться

 return name + "(" + age + ")";

для

return name + " (" + age + ")";

14
ответ дан 30 мая 2011 в 02:05 Источник Поделиться

Это нормально, но я бы написал последний метод как вернуть (возраст >= 18);

11
ответ дан 30 мая 2011 в 02:05 Источник Поделиться

Я не думаю, что это хорошая идея, чтобы написать метод toString метод с аргументами - таким образом вы не переопределить значение по умолчанию объекта.метод toString и не будет иметь никаких выгод от его использования вне кода. Например, при выводе элементы коллекции, которые содержат лицо не выдаст ни возраст, ни имя, но что-то вроде Человека@a3f33f (реализация по умолчанию).
По крайней мере, метода toString без параметров, а также

9
ответ дан 30 мая 2011 в 02:05 Источник Поделиться

Ваш код-это почти нормально. Я бы изменил две вещи:

Следующие немного короче :)

public boolean canVote()
{
return age >= 18;
}

Ваш метод toString(истина) будет возвращать "Сью(21)" , а не "Сью (21)" (с пробелом), которые просят. Мой метод toString будет выглядеть так:

public String toString(boolean full)
{
String str = name;
if(full) {
str += " (" + age + ")";
}

return str;
}

5
ответ дан 30 мая 2011 в 02:05 Источник Поделиться

В дополнение к другим комментариям, на ваш конструктор, имеющий аргумент под названием "СТ" не особенно полезным для читателя, так как он не говорит им, что это за. Судя по коду, стиль перспективе может быть лучше, чтобы иметь аргумент назвал имя, и явно задать это.имя = имя в теле.

5
ответ дан 30 мая 2011 в 02:05 Источник Поделиться

Если возраст реализуется в примитивных целочисленных нет необходимости инициализировать его в 0, так как все примитивно номер экземпляра переменные инициализируются значением 0 по умолчанию. В любом случае, если вы вместо этого использовали оболочку (целое) инициализации для 0 не требуется.

Взгляните на "по умолчанию" раздел:

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

4
ответ дан 30 мая 2011 в 02:05 Источник Поделиться

Как насчет добавления константы на 18, скажем MIN_AGE_TO_VOTE?

И:

return name + (full ? " (" + age + ")" : "");

Менее читабельный, я согласен :-)

3
ответ дан 30 мая 2011 в 03:05 Источник Поделиться

Выглядит нормально, только canVote, возможно, немного корявый:

   public boolean canVote()
{
return age >= 18;
}

2
ответ дан 30 мая 2011 в 02:05 Источник Поделиться

Я хотел бы видеть, если вы можете сделать код компактнее.

public boolean canVote() {
return age >= 18;
}

2
ответ дан 30 мая 2011 в 02:05 Источник Поделиться

Это менее подробный

public int incrementAge() {
return ++age;
}

2
ответ дан 30 мая 2011 в 02:05 Источник Поделиться

Используйте Строку.формате вместо конкатенации строк:
возврат имя + "(" + возраст + ")"; становится

return String.format("%s (%s)", name, age);

2
ответ дан 7 июля 2012 в 09:07 Источник Поделиться


  1. Имя поля может быть окончательной. Делая переменной окончательной избавляет программиста от лишнего умственного жонглирования - он/она не должен сканировать код, чтобы увидеть, если переменная изменилась. (От @nerdytenor ответы.)

  2. Вы должны проверить аргумент в конструктор. Есть ли смысл создавать человека объект с именем, которое является нулем или пустой строкой? Если нет, проверьте его и бросать исключение NullPointerException или IllegalArgumentException. (Эффективная Java, второе издание, пункт 38: проверка параметров на валидность)

  3. Заметка о спецификация:


    Аргументы флаг уродливы. Проходя булеву функцию-это поистине ужасная практика. Это
    сразу же усложняет сигнатуру метода, громко провозглашая, что эта функция
    делает больше чем одну вещь. Он делает одну вещь, если флаг имеет значение true, и другое, если флаг false!

    Источник: Чистый код Роберт С. Мартин, глава 3: функции.

    Это должно быть два метода: метод toString() и toFullString(), например, без каких-либо параметров.


2
ответ дан 8 июля 2012 в 08:07 Источник Поделиться

Моя версия класса человек будет,

public class Person
{
private int age;
private String name;

public Person(String st)
{
this.name = st;
this.age = 0;
}
public String toString(boolean full)
{
return full?name + "(" + this.age + ")":name;
}

public int incrementAge()
{
return ++this.age;
}

public boolean canVote()
{
return (this.age >= 18);
}
}

0
ответ дан 6 июля 2012 в 11:07 Источник Поделиться