Question

Y at-il raison d'utiliser Integer.valueOf (X) pour initialiser un nombre entier finale, comme ci-dessous:

public class MyClass
{
  public static final Integer DAY_1 = Integer.valueOf(1); // Why do it this way?
  public static final Integer DAY_2 = 2; // When it can be done this way?
}

Je comprends cela était nécessaire dans les anciennes versions de Java avant autoboxing a été ajouté. Est-ce une raison pour ce type de code restent? Ou est-ce juste une mauvaise habitude?

Était-ce utile?

La solution

  • Il y a beaucoup de code écrit avant 1.5 est sorti. Il n'y a pas besoin de mettre à jour tout sans apporter aucun avantage.
  • Dans certains cas, il est plus clair que vous sont la boxe. Dans le cas que vous avez donné, vous pouvez facilement voir le type de cible sur la même ligne - mais ce n'est pas toujours le cas
  • .
  • Si vous voulez appeler une méthode qui a pour les deux Integer surcharges et int et que vous voulez appeler la surcharge de Integer, c'est un moyen facile de le faire.

Autres conseils

Un programmeur peut choisir d'écrire cette façon afin de souligner visuellement que DAY_1 est un entier (objet), pas un int.

Je ne dis pas que je le recommande, mais je ne pouvais imaginer que quelqu'un cette approche pour cette raison.

En plus des raisons de Jon, certaines personnes tout simplement pas comme automatique (non) la boxe, période. Il y a beaucoup de nuances à ce que certaines personnes choisissent d'éviter d'en interdisant catégoriquement son utilisation en général par des erreurs de compilation en option ou des avertissements (Eclipse peut les transformer en erreurs ou des avertissements, par exemple).

Si tel est le cas, il n'y a pas beaucoup de choix en plus d'utiliser la première, même dans les cas comme celui-ci où il est ne gagne pas vraiment beaucoup.

En ce qui concerne le compilateur est concerné, il n'y a pas de différence (même si l'on doit prendre des précautions dans le cas des arguments surchargées). Sous le capot, la forme indiquée pour DAY_2 est simplement converti en la forme utilisée pour DAY_1 par le compilateur.

Pour les êtres humains, il pourrait y avoir une différence. J'évite généralement automatique (non) la boxe comme un acte de programmation défensive, parce que je sens que la pratique rend trop facile pour moi d'oublier le cas nul. Mais vraiment, il est à vous.

Autoboxing peut conduire à des bugs très subtiles qui peuvent être très difficiles à trouver. À cause de cela, certains ont IDEs capacité à générer un avertissement lorsque tout type de boxe / unboxing est utilisé. Si vous voulez réduire au silence cette option avertissements 1 va le faire pour vous.

Alors, à la fin, tout se résume aux préférences personnelles et les normes de codage du projet.

Dans ce cas particulier, il n'y a pas de danger pour l'utilisation autoboxing.

Integer.valueOf (1) permet la mise en cache des valeurs communes; pour les valeurs de -128 à 128, il retourne toujours le même objet, par exemple, alors que de nouveaux entier (1) retournera toujours un nouvel objet. Je dirais qu'il est bon d'utiliser pour tous les types Nombre dérivé (entier, Long, BigDecimal, etc.), même si c'est probablement ce autoboxing fait sous les couvertures de toute façon.

Bart van Heukelom, la différence entre list.remove (1) et list.remove (new Integer (1)) est présent; list.remove (1) supprime l'objet à l'index 1 de la liste, list.remove (new Integer (1)) va supprimer tous les objets dans la liste qui sont égales à l'objet entier ayant une valeur de un. Rappelez-vous que les collections ne peuvent pas stocker primitives, seuls les objets.

Il est une mauvaise habitude et il n'y a aucune raison de le faire puisque la compilation va générer le Integer.valueOf() pour vous.

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