2017-08-14 1 views
16

Puis-je créer une classe instanciée avec l'opérateur =, comme le fait la classe String? Ou est-ce une fonctionnalité spécifique à la classe String en Java?Créer un objet immuable, instancié sans nouveau

+6

Non, vous ne pouvez pas. C'est quelque chose qui, comme vous l'avez dit, se trouve à l'intérieur de Java. – sudo

+12

Et les chaînes ne sont * pas * instanciées avec '='.Les constantes de chaîne sont définies avec '" ... "' et cela devient plus compliqué à partir de là. Donc, non, vous ne pouvez pas. Utilisez 'new'. Si vous n'aimez pas 'new', vous pouvez le cacher derrière une méthode statique ou quelque chose comme ça. –

+0

https://stackoverflow.com/questions/2068570/how-to-create-a-string-class-replica – soorapadman

Répondre

14

Parce que Java ne supporte pas opérateur défini par l'utilisateur Surcharger une nouvelle instance ne peut pas être créé avec = opérateur.

Découvrez Why doesn't Java offer operator overloading? pour plus d'informations

16

Non, vous ne pouvez pas créer une classe qui est instancié juste avec = opérateur, car vous ne pouvez pas surcharger un opérateur en Java comme vous pouvez en C++ ou C# (voir Operator overloading in Java).

String s sont instanciés lorsque vous utilisez "something" que si elle n'existe pas déjà dans la mémoire, de sorte que vous obtenez une référence au même objet exact String chaque fois que vous écrivez "something".

Par exemple, si vous faites:

String a = "something"; 
String b = "something"; 

Puis

a == b; // will be true. 

Vous pouvez jeter un oeil à ces questions pour en savoir plus sur la façon dont fonctionnent String objets:

7

code String s = "Hello World!" ne crée pas une nouvelle String. Il attribue une référence d'un String existant dans String Pool à s. Si le String n'existe pas dans String Pool, un nouvel objet String est créé dans String Pool, mais pas avec l'opérateur = seul.

Cela crée de nouvelles String objecs:

String s1 = new String("Hello World!"); // new Object 
String s2 = new String("Hello World!"); // new Object 

System.out.println(s1 == s2); // false 

Cela peut ou ne peut pas créer un nouvel objet String dans la chaîne Piscine:

String s1 = "Hello World!"; 
String s2 = "Hello World!"; 

System.out.println(s1 == s2); // true 

Vous pouvez obtenir assez proche du comportement mentionné ci-dessus à l'utilisation getInstance() modèle, considérez ceci:

public class Singleton { 
    private Singleton(){} 

    private static class SingletonHelper{ 
    private static final instance INSTANCE = new Singleton(); 
    } 

    public static Singleton getInstance() { 
    return SingletonHelper.INSTANCE; 
    } 
} 

Ensuite, vous pouvez utiliser:

Singleton s = Singleton.getInstance(); 
+3

Le premier extrait de code ne crée pas nécessairement un nouveau 'String' dans le pool de chaînes (les chaînes créées par' new String (...) 'ne sont pas contenues dans le pool). – Nevay

+0

@Nevay Vous avez bien sûr raison, ma faute, a corrigé ma réponse. –