2016-11-11 8 views
0

Мне нужно иметь класс с двумя конструкторами, один с одним и без аргументов. Предполагается, что один из них не должен ссылаться на другие с рандомизированными аргументами, поэтому не по умолчанию.Конструктор вызов contructor с аргументами

Вот некоторые примеры кода:

public Human(int ageIn, String nameIn){ 
    this.name = nameIn; 
    this.age = ageIn; 
} 

public Human(){ 
    String[] names = {"Peter", "Olof", "Alva", "Sanna", "Carl", "Illona"}; 
    double random = Math.random(); 
    int nameIndex = (int)(names.length*random+0.5); 
    String name = names[nameIndex]; 

    random = Math.random(); 
    int age = (int)(100*random+0.5); 

    this(age, name); 
} 

То, что делает это трудно это this() должен быть в начале конструктора, но я должен определить и выяснить name и age, прежде чем я могу вызовите с ними первый конструктор.

Есть ли способ обойти это? Спасибо!

+6

Я не знаю, есть ли лучший способ, но вы можете просто создать статический метод для каждого случайного параметра и вызвать 'this (getRandomAge(), getRandomName())' – AJPerez

+1

Да, я пробовал это и static - это ключевое слово, которое отсутствовало, так как оно было неприемлемым в том, что класс не инициализирован. Спасибо! Отправьте это как ответ, и я соглашусь. –

ответ

2

Вы можете создавать статические методы, которые делают эти случайные значения. Затем в строке 1 вашего конструктора вы можете позвонить:

public Human(){ 
    this(getRandomAge(), getRandomName()); 
} 
+0

Я только что видел, что @ajperez сказал то же самое в комментарии. Это был правильный ответ :) –

0

Как насчет чего-то подобного?

public class Human { 

    public Human() { 
     this(null, -1); 
    } 

    public Human(String name, int age) { 
     if(name == null) { 
      name = //your random name generation code 
     } 

     if(age == -1) { 
      age = //your random age generation code 
     } 

     this.name = name; 
     this.age = age; 
    } 
} 
+0

* «Один из них не должен вызывать другого с рандомизированными аргументами» * ... – Tom

+1

@ Действительно, я полностью пропустил это. Звучит, однако, как очень странная спецификация, поэтому я не могу решить, удовлетворяет ли мое новое предложение или нет. – rorschach

0

Не смешивайте проблемы. A Human не должен заботиться о выборе случайного имени на основе предопределенного набора имен и не вычислять случайный возраст!

Я бы скорее удалил конструктор no-arg (за исключением того, что у вас есть одно определенное значение для имени и для возраста, но кажется, что это не ваш случай) и извлечь эту логику за пределы Human, как правило, в HumanFactory ,

0

В качестве альтернативы вы можете создать factory method создать «случайный» Human:

public class MyProgram { 

    public static void main(String[] args) { 

     Human someRandomStranger = Human.createRandomHuman(); 
     //... 
    } 

} 

public class Human { 

    public Human(int ageIn, String nameIn){ 
     this.name = nameIn; 
     this.age = ageIn; 
    } 

    // ... 

    public static Human createRandomHuman(){ 
     String[] names = {"Peter", "Olof", "Alva", "Sanna", "Carl", "Illona"}; 
     double random = Math.random(); 
     int nameIndex = (int)(names.length*random+0.5); 
     String name = names[nameIndex]; 

     random = Math.random(); 
     int age = (int)(100*random+0.5); 

     return new Human(age, name); 
    } 

} 

Это будет держать ваши конструктор ясно из материала, который не должен быть там в первую очередь. Конструктор по умолчанию, который случайным образом присваивает значения своим полям, может быть случайно вызван в вашем коде и создать нежелательные результаты.

Правильно названный заводский метод, с другой стороны, поможет предотвратить такие ошибки и четко сообщить о вашем намерении.

Смежные вопросы