2010-08-27 19 views

Odpowiedz

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

Standardowy sposób jest taki:

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

Obawiam się, że nie ma się o wiele prostsze.

Edit: robi:

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

Dzięki aioobe, Ciągle zapominam to.


Oczywiście jeśli często utworzyć tablicę można utworzyć metody pomocnika, który sprawia, że ​​rzeczy nieco prostsze:

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

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

(Ale nie można egzekwować w czasie kompilacji, że będzie tablicą tylko z jednego elementu)


Następny miałem zamiar napisać metodę singleton tablicy, ale Stephen beat me to that.

+1

"Obawiam się, że nie jest to o wiele prostsze niż to.". W tym wierszu możesz usunąć 'new String []' :-) – aioobe

+0

Aby być sprawiedliwym, "normalna" notacja naprawdę nie jest tak trudna. –

+0

@aioobe dodał, że zmiana, dzięki –

4

To powinno załatwić sprawę

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

generycznej wersji tej metody byłoby dość niewygodne w użyciu, ponieważ trzeba by przekazać mu Class przedmiot jako dodatkowy parametr.

Podkreślenie wyrażenia SomeType[]{elem} jest prostsze i tak zwykle robiłbym to.

2

Można to zrobić:

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

EDIT: Whoops! Powyższy przykład się nie kompiluje. Jak podano w komentarzu, można to zrobić albo jak:

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

+1

nie kompiluje. Musi to być 'Object [] a = Collections.singletonList (" SingleElement "). ToArray();' lub 'String [] a = Collections.singletonList (" SingleElement "). ToArray (nowy ciąg [1]);' –

5

rozwiązania enum (anty odzwierciedlić ataku):

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

    final String[] values; 

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

odniesienie go jako:

MySingleton.INSTANCE; 
+0

+1 dla poprawnego sposobu na utworzenie prawdziwego singletonu na JVM – gpampara

+1

OP nie pyta o Singleton (jak w przypadku wzoru GOF), ale tylko o to, jak utworzyć tablicę z jednym elementem (znanym również jako tablica singletona w języku angielskim, na przykład metody singleton * w kolekcjach). Tak więc twoje {"a", "b"} nie jest tablicą singleton (ma 2 elementy), mimo że jest przykładem wzorca Singleton. – Eponymous

0

Jeśli Twój projekt korzysta już z Apache Common s lib, możesz trzymać się metody ArrayUtils.toArray().

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

Nawet jeśli używasz import statyczny to jest jeszcze bardziej gadatliwy niż przyjętym odpowiedź:

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

Ale chodzi bardzo przydatna, gdy składnia initializer zwarty szyk nie jest dozwolone.

Kilka przykładów:

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); 
} 

można sobie wyobrazić jakiekolwiek inne przykłady siebie.

Należy również zauważyć, że ArrayUtils.toArray() może zawijać dowolną liczbę obiektów do tablicy, a nie tylko jedną.

Powiązane problemy