47 votes

Meilleur moyen de créer un tableau singleton

Quel est le moyen le plus simple pour vous de créer un tableau d'objets singleton (avec exactement un élément) en Java ?

48voto

Molske Points 1596
Object [] singleton = { new SomeObject() };

20voto

Sean Patrick Floyd Points 109428

La méthode standard est la suivante :

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

J'ai bien peur que ce ne soit pas plus simple que ça.

Edit : c'est le cas :

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

Merci aioobe, j'oublie toujours ça.


Bien sûr, si vous créez souvent des tableaux, vous pouvez créer une méthode d'aide qui simplifie un peu les choses :

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

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

(Mais vous ne pouvez pas imposer au moment de la compilation qu'il s'agira d'un tableau avec un seul élément).


Ensuite, j'allais écrire une méthode de tableau singleton, mais Stephen m'a battu à ce sujet. .

12voto

Yoory N. Points 1043

Si votre projet utilise déjà la librairie Apache Commons, vous pouvez vous en tenir à ArrayUtils.toArray() méthode.

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

Même en utilisant l'importation statique, cela reste plus verbeux que la réponse acceptée :

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

Mais il est très pratique lorsque la syntaxe de l'initialisateur de tableau compact n'est pas autorisée.

Quelques exemples :

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

Vous pouvez imaginer vous-même d'autres exemples.

Notez également que le ArrayUtils.toArray() peut envelopper un nombre arbitraire d'objets dans un tableau, et pas seulement un seul.

5voto

Enum solution(anti reflect attack) :

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

    final String[] values;

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

le référencer comme :

MySingleton.INSTANCE;

4voto

Stephen C Points 255558

Cela devrait faire l'affaire

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

Une version générique de cette méthode serait quelque peu difficile à utiliser, car il faudrait lui passer un fichier Class en tant que paramètre supplémentaire.

Mise en ligne de la SomeType[]{elem} est plus simple, et c'est ainsi que je procéderais normalement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X