Pourquoi String est-il la seule classe pour laquelle des littéraux existent en Java?

StackOverflow https://stackoverflow.com/questions/1404887

  •  05-07-2019
  •  | 
  •  

Question

Pourquoi java.lang.String est-il la seule classe pour laquelle il existe deux modes de création:

1) Normalement avec " nouveau " mot clé.

String s = new String("abc");

2) Avec String littéral (disponible uniquement avec la classe String )

String s = "abc";

Alors pourquoi y a-t-il des littéraux String et aucun littéral pour les autres classes?

Était-ce utile?

La solution

La chaîne, tout en étant une classe ordinaire, représente l'un des éléments de base de la programmation (les autres étant des nombres et des valeurs booléennes). C'est pourquoi Java a considéré les objets String comme des variables semi-primitives dès le premier jour et l'a autorisé.

Plus tard, lorsque la boxe automatique est devenue une partie du compilateur standard, vous pouvez également créer des objets wrapper numériques de cette façon, à savoir.

Integer i = 123;

comme le mentionne Tom Hawtin-tackline dans les commentaires sur la question.

Autres conseils

Réponse courte, car les concepteurs de langage en avaient envie.

Je suppose que String est une classe si commune qu’ils ont fait une exception. Je suis sûr qu'il y a quelques autres exceptions similaires aussi (voir le commentaire de Tom Hawtins)

Laissant de côté l'autoboxing (qui ne compte pas IMO - les littéraux sont pour les types primitifs plutôt que pour les classes; il existe simplement une conversion implicite en classe wrapper), le constructeur String (String) est réellement utile. Il faut une copie des données de caractères, ce qui signifie que si la chaîne originale est petite mais avec un code de grande taille <[char> char [] ], la nouvelle chaîne en est indépendante.

Cela peut être important si vous lisez des lignes courtes d'un fichier, par exemple.

Pourquoi existe-t-il des littéraux de chaîne: parce qu’ils sont utiles. Qu'auriez-vous à la place? Souhaitez-vous forcer les développeurs à utiliser:

String x = new String(new char[] { 'h', 'e', 'l', 'l', 'o' });

et en même temps ne pas avoir un stage?

Pour quelle autre classe voudriez-vous un littéral? On pourrait soutenir que des littéraux pour les cartes et les listes seraient utiles - je ne me souviens pas s'ils viendront en Java 7 ou non. Vous pouvez considérer les initialiseurs de tableaux comme "un peu comme un littéral". en ce que c'est un raccourci pour l'initialisation d'objet.

Je suppose que parce que String est un type de données fondamental, ils le considèrent au même niveau que les primitives.

Btw,

new String("abc");

crée en réalité 2 chaînes:

  1. l'interné dont vous perdez la référence
  2. une nouvelle instance avec le même contenu

Personnellement, je n'ai jamais trouvé nécessaire d'utiliser le constructeur de String.

Les types d'objet ayant des littéraux sont Chaînes , null et littéraux de classe .

Il est également possible d'utiliser des initialiseurs pour tableaux et les littéraux primitifs peuvent également être utilisés pour créer des objets s'ils sont utilisés en tant qu'initialiseurs, ce qui convient aux "deux modes de création". dans une syntaxe simple sans être de vrais littéraux (ils ne peuvent être utilisés que pour initialiser une valeur plutôt que partout où une expression d'objet peut se produire).

Si vous utilisez d'autres techniques telles que la sérialisation et la réflexion, vous pouvez rompre les "deux modes de création". aussi.

Il est prévu que Java 7 offre la possibilité de initialiser les collections via des littéraux très similaires aux littéraux de tableau:

Dernière vérification:

Integer wInt = 1;

Fonctionne très bien.

La dernière forme de création implique également l’internalisation des chaînes. Autrement dit, si vous avez le code:

String s = "abc";
String t = "abc";

le compilateur optimisera cela et vous obtiendrez deux références au même objet String. (s == t sera vrai).

L'internement de chaînes fonctionne également pour les expressions de chaînes.

Il existe bien entendu également des littéraux pour tous les types numériques primitifs, ainsi que les booléens true et false et les caractères. Je suppose que vous pouvez répondre que dans votre question, vous avez techniquement dit "pas de littéraux pour d'autres classes ". D'accord. Je pense que quelqu'un a souligné que " null " est un objet littéral, votre déclaration est donc techniquement inexacte, mais je pense que c'est le seul autre exemple.

Mais ensuite, la prochaine question évidente est de savoir à quelles autres classes voudriez-vous avoir des littéraux? Si vous conceviez le langage, à quoi ressemblerait un littéral BufferedReader? Ou un littéral ResultSet? Ou une JCheckBox?

Vous pouvez théoriquement dire que, par exemple, un "fichier littéral". est le nom du fichier inclus dans un délimiteur spécial, tel que "$ / home / bob / monfichier.txt $". Mais alors, quelqu'un pourrait dire: Qu'en est-il d'un JButton, ne pourrions-nous pas en faire un littéral, comme avec le texte du bouton et le ActionListener qu'il déclenche et des délimiteurs appropriés, comme "% Submit, SubmitListener%". Et puis, qu'en est-il de Sockets, ne pourrions-nous pas mettre le nom d'hôte dans un séparateur spécial, etc. Je pense qu'il est assez clair que nous serions rapidement à court de signes de ponctuation pour les utiliser comme délimiteurs. Nous devions donc finir par écrire un texte quelconque pour identifier la classe dont nous parlons, comme en disant File ("/home/bob/myfile.txt") ou Socket (" www.example.com "). , 631). Mais cela ressemble beaucoup à un constructeur et nous reviendrions à ce que les auteurs de Java ont réellement fait.

Le nombre de "choses" " cela peut être exprimé uniquement par la nature de la valeur (par exemple, tous les chiffres constituent un littéral numérique) ou par la ponctuation est assez limitée par le nombre de signes de ponctuation qui peuvent être ajustés de manière réaliste sur un clavier. Et voudriez-vous un clavier avec 600 icônes spéciales pour toutes les sortes de choses dont vous pourriez parler? Les mots sont tellement plus faciles et plus souples.

La chaîne de caractères est si couramment utilisée et les solutions de rechange auraient été si gênantes qu'il était logique d'en faire un cas spécial.

Les littéraux de chaîne sont un raccourci pratique avec une priorité et une syntaxe bien établies. Si les concepteurs de Java voulaient attirer les programmeurs C ++, les littéraux de chaîne devaient être présents. Heureusement, la gestion des chaînes est beaucoup plus rationnelle en Java qu'en C ++.

Aucun autre objet standard n’avait une syntaxe de facto - comment écririez-vous un littéral de carte?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top