2012-07-20 2 views
6

Więc, jak rozumiem, trzeba zawsze Program do interfejsu, na przykład:Programowanie do interfejsu - unikanie później obsady

List<Integer> list = new LinkedList<Integer>(); 

So, później w moim programie mam:

public List<Integer> getIntegers() { 
    return list; 
} 

public void processIntegers() { 
    // I need an arraylist here 
    ArrayList<Integer> list = (ArrayList<Integer>) getIntegers(); // can I do this better, without a cast? 
} 

Czy mogę zastosować tutaj lepszy wzór lub jakoś zrobić coś, aby uniknąć obsady? Casting wydaje się bardzo brzydki w tym scenariuszu.

Dzięki.

+1

Chciałbym również zapytać, dlaczego jest to lepsze niż używanie przez cały czas tablicyList, jeśli w końcu rzut jest nieunikniony. – dontcare

+0

@dontcare Tak więc możesz przekazać tę listę liczb całkowitych do ogólnej funkcji, która akceptuje listę, a nie konkretnie listę. – jn1kk

+0

powinieneś programować do najmniej określonego typu, którego możesz uciec i dalej. – plasma147

Odpowiedz

7

Przede wszystkim należy zadać sobie pytanie: dlaczego potrzebujemy ArrayList? Ponadto, czy klienci twojego API powinni się o to troszczyć? Masz kilka możliwości:

  • zrobić getIntegers() zwrot ArrayList<Integer>. To nie jest zbrodnia.

  • Rozważ mniej wymagające wymagania dotyczące interfejsu, np. AbstractList jako konsensusu

  • utworzyć kopię obronną, tak że można spożywać żadnych List:

    ArrayList<Integer> list = new ArrayList<Integer>(getIntegers()); 
    

    rozważyć użycie instanceof operatora, aby uniknąć niepotrzebnych kopii jeśli getIntegers() jest już ArrayList.

Innymi słowy - nie ma sposobu, aby uniknąć tego odlewu ze swoimi wymaganiami i elegancki sposób.