2014-02-03 6 views
0

Я только что начал работать с учебниками по Java, и решил немного поиграть с вложенными классами.Ссылка на внутренние экземпляры класса из внешнего класса

Рабочая копия, которую я создал, представляет собой класс Bicycle, который может иметь в нем не более чем один экземпляр класса Rider. Изнутри экземпляра Bicycle я хотел бы иметь возможность работать с экземплярами Riders.

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

Мой вопрос в том, что. Есть ли другой способ ссылаться на экземпляры Rider с Bicycle, или мне нужно сохранить свой собственный список?

//Outer Class contains zero or more Inner Classes 
public class Bicycle { 

    //ArrayList of Inner Class instances 
    private List<Rider> Riders = new ArrayList<Rider>(); 

    class Rider { 
     private String riderName; 

     protected Rider(String newRiderName) { 
      this.riderName = newRiderName; 
     } 

     protected String GetRiderName(){ 
      return riderName; 
     } 

    } 

    //When creating an Outer Class, we can instantiate zero or more Inner Classes, by name 
    public Bicycle(String... startingRiderName) { 

     //Loop through all Inner Class instance names and create an Inner Class for each 
     for (String newRiderName : startingRiderName) { 
      Riders.add(new Rider(newRiderName)); 
     } 
    } 

    //Public method to return an array of Inner Class instance names 
    public String[] GetRiderNames() { 

     String[] riderNames = new String[Riders.size()]; 

     // Just in case we mess up and ask the ArrayList for an out of bounds index 
     try { 
      for (int riderIndex = 0; riderIndex < Riders.size(); riderIndex++) { 
       riderNames[riderIndex] = Riders.get(riderIndex).GetRiderName(); 
      } 
      return riderNames; 
     } catch (IndexOutOfBoundsException e) { 
      return null; 
     } 
    } 

} 

ответ

5

Список должен быть сохранен где-нибудь, в противном случае эти экземпляры внутреннего класса будут собраны в мусор. Является ли это в массиве, который является членом Bicycle или в какой-то внешней структуре данных, является конструктивным решением, но нет автоматического списка, хранящегося в Java внутренних экземпляров класса.

1

Да, вам нужно будет вести список.

Кроме того, Райдер, похоже, не должен быть внутренним классом велосипеда. Сделав Райдера частным внутренним классом, вы говорите, что он только полезен для велосипеда. Концептуально внутренний класс больше подходит для некоторой части части Bicycle, которая выполняет внутреннюю операцию над внутренними данными или содержит внутренние данные, которые составляют и специфичны для этого велосипеда. Я мог бы представить, что FlatTyreEventHandler является внутренним классом, но я не думаю о Всаднике как о внутренней структуре или работе велосипеда.

Теперь, имея всадника и внутреннего класса велосипеда, может работать в вашем случае, но имейте в виду, что все, что хочет знать окружающий мир о гонщике, должно пройти через велосипед, поэтому вам придется продолжать добавлять методы таких как GetRiderAge(), GetRiderRoutePreference(). Эти методы специфичны для всадника и не имеют никакого отношения к велосипеду. Если вы обнаружите, что делаете это, Rider на самом деле не является внутренним скрытым классом, но вместо этого методы на велосипеде - это просто сквозные пути к методам Rider, а использование его как внутреннего класса мало чем необходимо. Кроме того, велосипед потерял единственную цель (быть велосипедом) и раздувается с интерфейсом Rider.

Итак, я, вероятно, сделаю Райдера отдельным классом, а затем у велосипеда будет список всадников. Кроме того, у вас может быть отдельный класс, который является BicycleRiders, и этот класс может содержать карту с велосипедов на райдеров.

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