Returnarea unui tablou gol (Programare, Java, Array-Uri)

Raza de lună a intrebat.

Încerc să mă gândesc la cel mai bun mod de a returna un array gol, mai degrabă decât null.

Există vreo diferență între foo() și bar()?

private static File[] foo() {
    return Collections.emptyList().toArray(new File[0]);
}
private static File[] bar() {
    return new File[0];
}

Comentarii

  • foo() este recomandat doar pentru a ascunde ceea ce face codul. –  > Por user85421.
  • @Carlos, recunosc că este complicat, dar cele două metode sunt în esență echivalente, nu? –  > Por Moonbeam.
  • echivalente dacă ignori lizibilitatea… poți complica aproape totul. Care este cel mai bun mod de a returna zero? return 15 - 3*5 + 0;? –  > Por user85421.
  • @Carlos, Punct luat! haha… –  > Por Moonbeam.
  • doar o notă: foo() va returna matricea creată ca parametru transmis la toArray! –  > Por user85421.
8 răspunsuri
Peter Lawrey

O altă modalitate de a returna o matrice goală este să folosiți o constantă, deoarece toate matricele goale de un anumit tip sunt identice.

private static final File[] NO_FILES = {};
private static File[] bar(){
    return NO_FILES;
}

Comentarii

  • Da, acesta este celălalt mod în care am văzut că se face. Cred că faptul că foo() a funcționat m-a dezorientat un pic. Și nu eram sigur dacă trimiterea la o constantă ar avea vreun beneficiu. Nu știu… doar lipsa mea de experiență, presupun. –  > Por Moonbeam.
  • +1: Deoarece o matrice goală este imuabilă, aceasta este cea mai bună soluție. –  > Por Martijn Courteaux.
  • @Moonbeam, Din punct de vedere al performanței, înseamnă că nu este nevoie să creați un obiect de fiecare dată. –  > Por Peter Lawrey.
  • @Peter, Acestea fiind spuse, ar fi foo() fi mai preferabil decât bar(), unde soluția pe care ați furnizat-o ar fi optimă? –  > Por Moonbeam.
  • @Moonbeam, Încă mai cred că foo() face mai mult decât este necesar, ceea ce poate duce la confuzie cu privire la ceea ce face. Se întâmplă adesea ca oamenii să presupună că: a) extra a fost pus acolo cu un motiv și durează mult timp pentru a găsi ceva care nu este acolo, b) face mai multă muncă decât trebuie, chiar dacă nu este cazul) – -.  > Por Peter Lawrey.
weekens

Ambele foo() și bar() pot genera avertismente în unele IDE-uri. De exemplu, IntelliJ IDEA va genera un avertisment Allocation of zero-length array avertisment.

O abordare alternativă este utilizarea Apache Commons Lang 3 ArrayUtils.toArray() cu argumente goale:

public File[] bazz() {
    return ArrayUtils.toArray();
}

Această abordare este atât performantă, cât și prietenoasă cu IDE, dar necesită o dependență de la o terță parte. Cu toate acestea, dacă aveți deja commons-lang3 în classpath, ați putea chiar să folosiți array-uri goale definite static pentru tipurile primitive:

public String[] bazz() {
    return ArrayUtils.EMPTY_STRING_ARRAY;
}

Comentarii

  • Aceasta este ceea ce căutam. Vă mulțumesc. –  > Por Bandham Manikanta.
Martijn Courteaux

Cu siguranță al doilea. În prima, folosiți o constantă goală List<?> și apoi o convertiți în File[], ceea ce necesită crearea unui gol File[0] gol. Și asta este ceea ce se face în al doilea, într-un singur pas.

Comentarii

  • +1: Prima este confuză. Dar nu creează o listă. Listă goală() returnează o constantă. –  > Por Peter Lawrey.
  • @Peter: Mulțumesc, nu știam. Mi-am editat răspunsul. Îți voi da +1. –  > Por Martijn Courteaux.
MAHENDRA SINGH CHAUHAN

Poți returna o matrice goală prin următoarele două moduri:

Dacă doriți să returnați o matrice de int atunci

  1. Folosind {}:

    int arr[] = {};
    return arr;
    
  2. Folosind new int[0]:

    int arr[] = new int[0];
    return arr;
    

În același mod, puteți returna array și pentru alte tipuri de date.

Gourav Goutam
return new File[0];

Aceasta este o abordare mai bună și mai eficientă.

Comentarii

  • Aceasta nu răspunde deloc la întrebare. –  > Por Ignatius.
  • Un răspuns bun ar trebui să explice de ce este mai eficientă, astfel încât cititorii să poată valida că este corectă și – mai important – aplicabilă pentru situația lor. (Iar un comentariu prost susține deficite care pot fi sau nu adevărate, așa cum spui chiar tu în „cred că nu” – asta e pur și simplu necivilizat; astfel de comentarii tind să fie marcate și, în ultimă instanță, eliminate de un moderator). –  > Por toolforger.
AlexR

Nu există nici o diferență în afară de faptul că foo efectuează 3 apeluri de metode vizibile pentru a returna un array gol care oricum este creat, în timp ce bar() doar creează acest array și îl returnează.

dominicbri7

Sunt destul de sigur că ar trebui să alegi bar();deoarece cu foo(); se creează o listă (degeaba) din moment ce oricum creezi un nou fișier[0] la final, așa că de ce să nu mergi pe returnarea directă a acestuia!

Marco

Într-o singură linie ai putea face:

private static File[] bar(){
    return new File[]{};
}

Comentarii

  • new File[0] ar face același lucru ca și new File[]{}, cu mai puține simboluri, și m-aș aștepta să compileze în același bytecode. –  > Por toolforger.