2010-08-27 11 views

Antwort

27
Object [] singleton = { new SomeObject() }; 
9

Der üblicher Weg ist dies:

String[] arr = new String[]{"I am the one and only"}; 

Ich fürchte, es nicht viel einfacher als diese bekommen.

Edit: es tut:

String[] arr = {"I am the one and only"}; 

Dank aioobe ich dies immer wieder zu vergessen.


Natürlich, wenn Sie oft Array erstellen Sie eine Hilfsmethode erstellen können, die Dinge ein wenig einfacher macht:

public static <T> T[] asArray(T... items){ 
    return items; 
} 

String[] arr = asArray("I am the one and only"); 

(Aber Sie bei der Kompilierung durchsetzen kann nicht, dass es ein Array wird mit nur einem Element)


Weiter würde ich ein Singleton-Array-Verfahren schreiben, aber Stephen beat me to that.

+1

"Ich fürchte, es wird nicht viel einfacher als das.". In dieser Zeile können Sie 'new String []' entfernen :-) – aioobe

+0

Um fair zu sein, ist die 'normale' Notation wirklich nicht so schwierig. –

+0

@aioobe hinzugefügt, dass ändern, danke –

4

zu verwenden Dies sollte den Job

public SomeType[] makeSingletonArray(SomeType elem) { 
    return new SomeType[]{elem}; 
} 

Eine generische Version dieses Verfahrens wäre etwas umständlich, da man es ein Class Objekt als zusätzliche Parameter übergeben werden müßte.

Inline-Ausdruck der ist einfacher, und das würde ich normalerweise tun.

2

Sie können dies tun:

String[] a = Collections.singletonList("SingleElement").toArray();

Edit: Whoops! Das obige Beispiel kompiliert nicht. Wie im Kommentar erwähnt, kann dies getan werden entweder als:

Object[] a = Collections.singletonList("SingleElement").toArray();
Oder
String[] a = Collections.singletonList("SingleElement").toArray(new String[1]);

+1

Kompiliert nicht. Muss entweder 'Object [] a = Collections.singletonList (" SingleElement ") sein toArray();' oder 'String [] a = Collections.singletonList (" SingleElement "). ToArray (neuer String [1]);' –

5

Enum-Lösung (anti reflektieren Angriff):

enum MySingleton{ 
    INSTANCE(new String[]{"a","b"}); 

    final String[] values; 

    private MySingleton(String[] values) { 
     this.values = values; 
    } 
} 

Referenz als:

MySingleton.INSTANCE; 
+0

+1 für den richtigen Weg, um einen echten Singleton auf der JVM zu machen – gpampara

+1

Das OP fragt nicht nach einem Singleton (wie in einer Instanz des GOF-Musters), sondern nur nach einem Array mit einem Element (auch bekannt als Singleton-Array in Englisch wie die Singleton * -Methoden in Collections). Also ist Ihr {"a", "b"} kein Singleton-Array (es hat 2 Elemente), obwohl es sich um eine Instanz des Singleton-Musters handelt. – Eponymous

0

Wenn Ihr Projekt Apache Common bereits verwendet s lib, können Sie auf ArrayUtils.toArray() Methode bleiben.

String[] arr = ArrayUtils.toArray("The string"); 
// or if using static import 
String[] arr = toArray("The string"); 

Selbst bei Verwendung von statischen Import es noch ausführlicher als die akzeptierte Antwort:

String[] arr = {"The string"}; 

Aber es ist sehr handlich, wenn kompakte Arrayinitialisierungssyntax nicht erlaubt ist.

Einige Beispiele:

someMethod(toArray("The string"), /* other params */); 

return toArray("The string"); 

@DataProvider 
public Object[][] someDataProvider() { 
    return rangeClosed(-12, +12) 
     .map(HOURS::toMillis).boxed() 
     .map(ArrayUtils::toArray) 
     .toArray(Object[][]::new); 
} 

Sie weitere Beispiele sich vorstellen kann.

Beachten Sie auch, dass die ArrayUtils.toArray() kann eine beliebige Anzahl von Objekten in Array, nicht nur eine einzelne.

Verwandte Themen