2012-02-28 4 views
0

В FleetTUI.java У меня есть список флотов (каждый флот будет иметь собственный список грузовиков).Java: Доступ к ArrayList внутри ArrayList?

private static ArrayList<Fleet> fleetCollection; 

В Fleet.java у меня есть список объектов грузовика.

ArrayList<Truck> fleetList; 

, который инициализируется в его конструкторе.

public Fleet(String businessName){ 
    this.businessName = businessName; 
    this.fleetList = new ArrayList<Truck>(); 
} 

Поэтому каждый раз, когда я делаю новый флот, я также составляю список грузовиков вместе с ним.

В FleetTUI.java, у меня есть метод, который добавляет грузовик к флоту, сделанные до:

public static void addTruck(){ 
    printFleets(); 
    System.out.println("Please enter the fleet number where this truck will be added:"); 
    inputText = scan.nextLine(); 
    int inputFleetId = Integer.parseInt(inputText); 
    System.out.println("Please enter the truck's horn sound:"); 
    inputText = scan.nextLine(); 
    String inputHorn = inputText; 
    System.out.println("Please enter the truck's fuel capactity:"); 
    inputText = scan.nextLine(); 
    int inputFuelCapacity = Integer.parseInt(inputText); 
    System.out.println("Please enter the amount of gas remaining in the tank:"); 
    double inputGasRemaining = Double.parseDouble(scan.nextLine()); 
    **Fleet.fleetList**.add(inputFleetId, new Truck(inputHorn, inputFuelCapacity, inputGasRemaining)); 
    System.out.println("--- A truck that goes " + inputHorn + " with " + inputGasRemaining + " gallon(s) in a " + inputFuelCapacity + " gallon tank has been added to " + **fleetCollection.getBusinessName()** + "'s fleet ---"); 
    System.out.println(""); 
} 

Я где жирным шрифтом я получаю сообщение об ошибке. Ошибки:

Может не сделать статическую ссылку на нестатическое поле Fleet.fleetList

Невозможно сделать статическую ссылку на не-статический метод getBusinessName() от типа флота

Я не знаю никакого другого способа доступа к списку машин внутри парка, я создал с помощью метода:

public static void createFleet(){ 
    System.out.println(""); 
    System.out.println("Please enter the name of the fleet."); 
    inputText = scan.nextLine(); 

    fleetCollection.add(new Fleet(inputText)); 
    printFleets(); 
    System.out.println(""); 
    System.out.println("--- Fleet: " + inputText + " added ---"); 
    System.out.println(""); 

} 

Итак, я думаю, действительно, мой вопрос: Как правильно добавить новый грузовик в список Грузовиков, который находится внутри Флота, который я только что сделал, используя createFleet(), который размещен в собственной коллекции флотов?

Обновление: Спасибо :) вы, ребята, действительно помогли мне! еще раз!

+0

почему ваш метод 'addTruck()' static? –

+0

Это выглядит как плохой дизайн для меня. статические следует использовать с осторожностью и, когда это необходимо. Я предполагаю, что вам следует избавиться от всех ваших статических ключевых слов и правильно создать объекты. Если tomorrown попросит вас обработать несколько флотов, ваш весь код должен быть реорганизован. –

+0

Чтобы избежать путаницы, переименуйте свой 'fleetList' в' truckList', вот что он представляет. –

ответ

2

Ваша проблема в том, что вы создаете методы static, в которых вы пытаетесь получить доступ к переменной non-static, в данном случае это fleetlist. Это приведет к появлению ошибки.

Поскольку вы используете конструктор и все такое, вам не нужно вызывать метод static. Вызов статичного метода позволит вызвать метод без объекта, который должен быть сконструирован, что из того, что я вижу, - это не то, что вам нужно.

Так короче, чтобы ваши методы не статическое удаление static ключевого слова из объявления методы и получить доступ к методам, таким как addTruck() и createFleet() через использование инициализировано Fleet объекта.

С другой стороны, вы можете объявить fleetlist быть статическим, например, так:

private static ArrayList<Truck> fleetList; 

EDIT: Видя ваш комментарий, это то, как вы можете это сделать:

В Java, это считается хорошей практикой, чтобы инкапсулировать переменные объекта, так что вы можете лучше контролировать доступ к такой переменной, так что вы можете сделать что-то вроде так в вашем Fleet класс:

private List<Truck> fleetList; 

public Fleet(String businessName){ 
    this.businessName = businessName; 
    this.fleetList = new ArrayList<Truck>(); 
} 

public List<Truck> getFleetList() 
{ 
    return this.fleetList; 
} 

В вашем FleetUI классе вы можете сделать что-то вроде этого:

private ArrayList<Fleet> fleetCollection;  
... 
for (Fleet fleet : this.fleetCollection) 
{ 
    for (Truck truck : fleet.getFleetList()) 
    { 
     //Do something with your truck here 
    } 
} 

EDIT 2: Для того, чтобы добавить грузовик в массив, вы можете это сделать 2-мя способами. Предположим, что объект fleet - это флот, к которому вы хотите добавить свой грузовик. В вашем FleetUI классе вы можете сделать так:

fleet.getFleetList().add(new Truck(...))

Другой (и, на мой взгляд, лучший способ), чтобы иметь addTruck метод в fleet объекта следующим образом:

public void addTruck(Truck truck) 
{ 
    this.fleetList.add(truck); 
} 
+0

@ user1176922: Я изменил свой ответ. Надеюсь, что это делает вещи более понятными для понимания. – npinti

+0

Я улучшил свой ответ. Как и FYI, вспомогательный метод инкапсулирует поле объект. Это инкапсуляция является одним из краеугольных камней ООП, и я бы рекомендовал вам научиться использовать его, поскольку он может быть весьма полезен. – npinti

+0

@ user1176922: Да, если вы хотите, вы можете сделать что-то вроде этого: 'for (Fleet флот: fleetCollection) {if (fleet.getName(). equals ("myFleet") {fleet.addTruck (новый грузовик (...)); break;}} '.В этом случае я предположил, что у объекта «Флот» есть имя, и вы хотели найти флот с определенным именем. Вы, очевидно, можете поменять любой другой механизм. – npinti

1
  1. Вы звоните

    Fleet.fleetList.add()

    метод от статического метода addTruck.

  2. Это плохая практика, чтобы ссылаться на элемент вроде этого:

    Fleet.fleetList.add

    вы должны ввести некоторые акцесора добавить грузовик к flletList в классе флота

+0

, поскольку я сказал, что проблема в том, что список не является статическим, и вы вызываете его метод add из статического метода addTruck. – aviad

+0

Я изменил все свои методы на нестатические. – user1176922

+0

Помогло ли это ситуации? :) – aviad

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