Jak mogę zainicjować tablicę String o długości 0 w Javie?

134

Dokumentacja Java dla metody
String[] java.io.File.list(FilenameFilter filter)
zawiera to w opisie zwrotów:

Tablica będzie pusta, jeśli katalog jest pusty lub jeśli żadne nazwy nie zostały zaakceptowane przez filtr.

Jak zrobić coś podobnego i zainicjować tablicę String (lub inną tablicę w tym zakresie), aby miała długość 0?

Ron Tuffin
źródło
7
Właśnie zdałem sobie sprawę, że to głupie pytanie :( Ponieważ te tablice są inicjowane dokładnie w taki sam sposób, jak każda inna tablica tylko o rozmiarze 0. Pokazuje, jak często inicjuję obecnie tablice. Zostawię pytanie (nie usunę go), ponieważ pewnego dnia ktoś inny może być tak samo głupi jak ja przed
chwilą
1
Nie wiem, jaki przypadek użycia miałbyś dla tablicy o długości 0 i dlaczego po prostu byś nie zainicjował nullw tym szczególnym przypadku.
Blake,

Odpowiedzi:

232

Jak powiedzieli inni,

new String[0]

rzeczywiście utworzy pustą tablicę. Jest jednak jedna fajna rzecz dotycząca tablic - ich rozmiar nie może się zmienić, więc zawsze możesz użyć tego samego odwołania do pustej tablicy. Więc w swoim kodzie możesz użyć:

private static final String[] EMPTY_ARRAY = new String[0];

a potem po prostu wracaj za EMPTY_ARRAYkażdym razem, gdy tego potrzebujesz - nie ma potrzeby tworzenia nowego obiektu za każdym razem.

Jon Skeet
źródło
7
Wygląda na to, że każdy lubi pisać:private static final String[] EMPTY_ARRAY = {};
Thomas Jung
8
@ Thomas: Rozumiem, ale w tym konkretnym przypadku wolę bardziej wyraźną formę. Jest dla mnie bardziej zrozumiałe, że oznacza to „Chcę mieć tablicę ciągów z 0 elementami” zamiast „Chcę mieć tablicę z taką zawartością - która jest pusta”. Myślę, że to tylko osobiste preferencje.
Jon Skeet
1
@Tony - muszę skorzystać z kilku miejsc, w których Java może wywnioskować typ. :-)
Thomas Jung
1
@delive: Przykład, który podałem, nadal tworzy pustą tablicę, ale ponieważ jest pusta, nie możesz jej użyć EMPTY_ARRAY[0]- to próba uzyskania dostępu do elementu 0, który nie istnieje ...
Jon Skeet
1
@theyuv: Ostatecznie to nie będzie miało znaczenia. Jeśli potrzebujesz go tylko w jednym miejscu, zadeklaruj to w tej klasie. Jeśli okaże się, że potrzebujesz go w większej liczbie miejsc, zawsze możesz przenieść go do klasy „użytkowej”.
Jon Skeet
23

String[] str = new String[0];?

Mauris
źródło
18
String[] str = {};

Ale

return {};

nie będzie działać, ponieważ brakuje informacji o typie.

Thomas Jung
źródło
10
return new String[] { };i return new String[0];oba będą działać.
Bombe
13

Ok, faktycznie znalazłem odpowiedź, ale pomyślałem, że i tak „zaimportuję” pytanie do SO

String[] files = new String[0];
lub
int[] files = new int[0];

Ron Tuffin
źródło
Dodaj taki komentarz do swojego pytania ... lub wybierz jedną z odpowiedzi, które mówiły to samo.
Jonathan Leffler
6
Dzięki za komentarz Jonathan. Jak pewnie zauważyłeś, opublikowałem tę odpowiedź wcześniej niż ktokolwiek inny (w związku z czym nie było odpowiedzi do wyboru). Nie rozumiem też, w jaki sposób dodanie odpowiedzi na pytanie poprawia pytanie.
Ron Tuffin,
2

Możesz użyć ArrayUtils.EMPTY_STRING_ARRAY z org.apache.commons.lang3

import org.apache.commons.lang3.ArrayUtils;

    class Scratch {
        public static void main(String[] args) {
            String[] strings = ArrayUtils.EMPTY_STRING_ARRAY;
        }
    }
freak0
źródło
0

Stwórz funkcję, która nie zwróci wartości null, zamiast tego zwróci pustą tablicę, którą możesz przeczytać poniższy kod, aby ją zrozumieć.

    public static String[] getJavaFileNameList(File inputDir) {
    String[] files = inputDir.list(new FilenameFilter() {
        @Override
        public boolean accept(File current, String name) {
            return new File(current, name).isFile() && (name.endsWith("java"));
        }
    });

    return files == null ? new String[0] : files;
}
Swapnil Gangrade
źródło