2 votes

Est-ce que ((Object)(this)).toString() appelle toujours l'implémentation de base ?

J'ai une implémentation de toString() qui s'appuie sur un code qui pourrait lever une exception.

Dans ce cas, je veux basculer vers le système par défaut. toString() méthode.

À cette fin, est-il sûr d'utiliser

catch (Exception e){
    return ((Object)(this)).toString();
}

comme gestionnaire de cette exception ? En d'autres termes, ce moulage forcera-t-il l'utilisation de l'option Object toString() méthode.

Cela semble fonctionner dans mon cas, mais j'ai peur que ce ne soit pas standard et que cela puisse provoquer une récursion.

4voto

GhostCat Points 83269

Pas du tout. La JVM détermine au moment de l'exécution en fonction du type exact d'un objet, quelle méthode invoquer.

Votre joli petit casting ne sert à rien. Parce que vous ne pouvez pas changer le type d'exécution d'une référence par un casting !

Une solution serait d'avoir quelque chose comme :

public String superToString() {
  return super.toString();
} 

à l'intérieur de ces classes, et d'invoquer cette méthode explicitement. Alternativement, la ligne qui fait actuellement ce cast pourrait être remplacée par return super.toString() bien sûr.

Mais alors, surtout l'option 1 ne ferait qu'ajouter "le pire au pire". Comme dans : le contrat de toString() est de retourner une chaîne de caractères.

Tout simplement jamais, jamais écrire toString() des méthodes qui

  • nécessite un travail intensif pour se produire ou
  • peut lancer une exception !

Ver Comment utiliser la méthode toString en Java ? pour d'autres réflexions.

Sérieusement : dans tout projet de grande envergure, vous avez zéro contrôler quand/à quelle fréquence/de quelle manière toString() est appelé sur vos objets. Vous devez vous assurer que ces appels reviennent rapidement, renvoient des informations raisonnables et ne lèvent jamais d'exception.

3voto

T.J. Crowder Points 285826

Non. Si c'était le cas, cela irait à l'encontre du polymorphisme d'exécution, qui est l'une des caractéristiques fondamentales de Java (pour les méthodes). La méthode sélectionnée dépend de l'objet réel sur lequel vous l'appelez, et non du type de référence que vous avez à l'objet (ce que modifie le casting).

Vous pourriez utiliser super.toString() qui utiliserait la version de votre superclasse (qui peut être ou ne pas être Object mais cela semble suffisant pour votre cas d'utilisation).

J'ai une implémentation de toString() qui s'appuie sur un code qui pourrait lever une exception.

Si c'est le cas, je recommande de le changer si possible. S'il n'est pas possible de le changer, je suggère de stocker la version de l'objet sous forme de chaîne de caractères. sur l'objet une fois qu'il a été généré dans toString afin que les appels ultérieurs ne soient pas coûteux (lever une exception est coûteux). Effacer la version de la chaîne de caractères stockée si l'objet est mutable et que quelque chose affectant la version de la chaîne de caractères est en cours. toString est modifié (pour qu'il soit reconstruit la prochaine fois). En général, toString doit être simple et rapide.

Appel à super La version de l'entreprise n'est probablement pas idéale. Au lieu de cela, peut-être générer une chaîne de caractères incorporant le sens de l'exception.

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