2014-11-23 2 views
1

У меня есть класс автомобилей:Добавление переменных экземпляра к объектам с помощью LinkedList Collection

public class Car { 

    public String name = null; // Name of the Car Model 
    public String color = null; // Color of the car 

    Car(){ 
      /** DO WHATEVER***/ 
    } 
} 

Затем в главном() класса я делаю это:

LinkedList<Car> myCars = new LinkedList<Car>(); 

    myCars.add(new Car()); 
    myCars.add(new Car()); 
    myCars.add(new Car()); 

    myCars.get(0).name = "Geep"; 
    myCars.get(0).color = "Black"; 

    myCars.get(1).name = "Camry"; 
    myCars.get(1).color = "Red"; 

    myCars.get(2).name = "Honda"; 
    myCars.get(2).color = "Green"; 

Мой вопрос :

Lets assume that at the time of Car object creations, we do not have values of these instance variables and we get them at a later stage, so that constructor initialization is not feasible. 

Тогда это правильный путь выше? Я имею в виду, как переменные экземпляра для каждого объекта будут присваиваться значениям в коллекции Java. Я имею в виду, используя метод get()? Я понимаю, если у нас есть много автомобилей
объектов, то мы будем использовать цикл for.

Просьба пояснить.

спасибо.

+0

Правильный способ в этом случае состоял в том, чтобы инициализировать эти значения в конструкторе автомобиля – user2717954

+0

@Navchetan: Не могли бы вы перефразировать/уточнить, что вы подразумеваете под: «Я имею в виду, как переменные экземпляра для каждого объекта будут назначены значения, в Java collection.I означает, используя метод get()? Я понимаю, если у нас есть много автомобилей объектов, то мы будем использовать цикл for. " – dubes

+0

Да, я понимаю. Но скажем, что на момент создания объекта у нас нет значений переменной экземпляра, и мы получаем их на более позднем этапе. И существует около 50+ переменных экземпляра для каждого объекта. Тогда это правильный и оптимальный способ: myCars.get (0) .name = «Geep»; myCars.get (0) .color = "Black" – Navchetan

ответ

4

Было бы больше смысла, чтобы изменить конструктор из: /** DO WHATEVER***/

к чему-то вроде:

Car(String name, String color){ 
    this.name = name; 
    this.color = color; 
} 

, а затем на вставке в списке:

myCars.add(new Car("Geep", "Black")); 
myCars.add(new Car("Camry", "red")); 
... 

В случае у вас нет «деталей» автомобилей, и вам просто нужно создать экземпляр списка с 50 автомобилями, а затем «добавить детали» - возникает еще один вопрос: где подробности взяты? если вы не знаете этого заранее, он должен исходить из вечного источника (пользовательский ввод, файл и т. д.), и тогда было бы целесообразно запустить цикл в списке и добавить данные:

for (Car car : myCars) { 
    String name = ... // get the details of the car from an external source 
    String type = ... // get the details of the car from an external source 
    car.setName(name); // of course you'll have to implement setName() and setType() 
    car.setType(type); // which is a better practice than exposing the class members via public access 
} 
+0

Да, я понимаю. Но скажем, что на момент создания объекта у нас нет значений переменной экземпляра, и мы получаем их на более позднем этапе. И существует около 50+ переменных экземпляра для каждого объекта. Тогда это правильный и оптимальный способ: myCars.get (0) .name = «Geep»; myCars.get (0) .color = "Black" – Navchetan

+0

@Navchetan см. Дополнение – alfasin

+1

@alfasin +1. Я бы также рекомендовал шаблон компоновщика, если у вас слишком много переменных экземпляра, делает код многоразовым, доступным для чтения и проще поддерживать IMHO. Вот ссылка [link] (http://www.javaworld.com/article/2074938/core-java/too-many-parameters-in-java-methods-part-3-builder-pattern.html) с еще несколькими информацию об этом. – dubes

0

Что касается правильного пути: я предпочитаю переопределять конструктор, чтобы мой код инициализации и настройки был в одном месте.

По сути, я бы предоставить конструктор для автомобилей, как:

public class Car { 

public String name = null; // Name of the Car Model 
public String color = null; // Color of the car 

public Car(String name, String color){ 
    super(); 
    this.name = name; 
    this.color = color; 
    } 
} 

Я бы поместить его в моей коллекции, как:

LinkedList<Car> myCars = new LinkedList<Car>(); 

myCars.add(new Car("Jeep", "Black")); 
myCars.add(new Car("Ferrari", "Red")); 
+0

Да, я понимаю. Но скажем, что на момент создания объекта у нас нет значений переменной экземпляра, и мы получаем их на более позднем этапе. И существует около 50+ переменных экземпляра для каждого объекта. Тогда это правильный и оптимальный способ: myCars.get (0) .name = «Geep»; myCars.get (0) .color = "Black" – Navchetan

+0

@ Навчетан понял, что в таком случае я бы предпочел: Car c = myCars.get (0); c.setName(); и т. д. Если у вас слишком много переменных экземпляра на объект, вы также можете взглянуть на шаблон Builder. Я отправлю образец кода и некоторые ссылки в ближайшее время – dubes

0

Во-первых, это не рекомендуется подвергать переменные экземпляра (общественности). Измените публикацию на частным и создайте геттеры. Кроме того, вы можете создать конструктор, который принимает имя и цвет параметров:

public class Car { 

    private String name = null; 
    private String color = null; 

    public Car(String name, String color) { 
     this.name = name; 
     this.color = color; 
    } 

    public String getName() { 
     return name;  
    } 

    public String getColor() { 
     return color; 
    } 
} 

Тогда вы можете сделать:

LinkedList<Car> myCars = new LinkedList<Car>(); 

myCars.add(new Car("Jeep", "Black")); 
myCars.add(new Car("Camry", "Red")); 
myCars.add(new Car("Honda", "Green")); 

Есть много способов сделать это, но я бы определенно установить информацию автомобиля перед добавлением его в список.

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