J'ai une méthode avec un paramètre Object o
.
Dans cette méthode, je sais exactement qu'il y a un String
dans "o" qui n'est pas nul. Il n'est pas nécessaire de vérifier ou de faire autre chose. Je dois le traiter exactement comme un objet String
.
Juste curieux - ce qui est moins cher - le cast dans String
, ou utilisez Object.toString()
? Ou est-ce la même chose par le temps/cpu-/mem- price?
Mise à jour: La méthode accepte Object
car c'est l'implémentation d'une interface. Il n'y a aucun moyen de changer le type de paramètre.
Et ça ne peut pas être null
du tout. Je voulais juste dire que je n'ai pas besoin de vérifier la nullité ou le vide. Dans mon cas, il y a toujours une chaîne non vide.
la conversion en chaîne est moins chère car cela ne nécessite pas d'appel de fonction externe, juste une vérification de type interne.
J'utiliserais un casting. Cela valide votre "connaissance" qu'il s'agit d'une chaîne. Si pour une raison quelconque vous vous retrouvez avec un bogue et que quelqu'un passe quelque chose d'autre qu'une chaîne, je pense qu'il serait préférable de lever une exception (ce qu'un casting fera) que de continuer à exécuter avec des données erronées.
Selon Réflexions stupides sur la performance: x.toString () vs (String) x
À la fin, les résultats sont étonnamment clairs: il est au moins deux fois plus rapide de convertir Object en String que d'appeler Object.toString ()
Si vous savez que l'objet o est une chaîne, je dirais simplement que vous le transformez en chaîne et l'appliquez de cette façon. Appeler toString () sur un objet dont vous savez avec certitude qu'il s'agit d'une chaîne pourrait simplement ajouter de la confusion.
Si l'objet o peut être autre chose qu'une chaîne, vous devrez appeler toString ().
Je ne serais pas trop préoccupé par les performances, si cette opération est effectuée même quelques milliers de fois par seconde - il n'y a pas de différence tangible.
Je serais cependant préoccupé de "connaître" l'entrée. Vous avez une méthode qui accepte un Object
et vous devez le traiter comme tel, c'est-à-dire que vous ne devriez pas savoir quoi que ce soit sur le paramètre, à part qu'il adhère au Object
interface, qui se trouve avoir une méthode toString()
. Dans ce cas, je suggère fortement d'utiliser cette méthode au lieu de simplement supposer quoi que ce soit.
OTOH, si l'entrée est toujours soit String
ou null
, changez simplement la méthode pour accepter String
s, et vérifiez explicitement null
s (ce que vous devez faire quand vous traitez avec des non-primitifs ...)
Il ne peut pas y avoir de 'chaîne nulle en o'. Si o est nul, il ne contient pas de chaîne nulle, il est juste nul. Vérifiez d'abord o pour null en premier. Si vous jeter ou appelez ToString () sur null, vous planterez.
Étant donné que le type de référence est un objet et que tous les objets ont un toString (), appelez simplement object.toString (). String.toString () renvoie juste ceci.
Si ce que vous avez dans "o" est une chaîne, alors il n'y a pas beaucoup de différence (la conversion est probablement plus rapide, mais c'est une chose d'implémentation VM/Library).
Si "o" n'est peut-être pas une chaîne mais qu'il est censé être une chaîne, le cast est ce que vous voulez (mais vous devez faire en sorte que la méthode prenne une chaîne au lieu d'un objet).
Si "o" peut être de n'importe quel type, vous devez utiliser la chaîne toString - mais assurez-vous de vérifier d'abord null.
void foo(final Object o)
{
final String str;
// without this you would get a class cast exception
// be wary of using instanceof though - it is usually the wrong thing to do
if(o instanceof String)
{
str = (String)o;
}
}
ou
void foo(final Object o)
{
final String str;
// if you are 100% sure that o is not null then you can get rid of the else
if(o != null)
{
str = o.toString();
}
}
Je préfère coder le dernier comme:
void foo(final Object o)
{
final String str;
if(o == null)
{
throw new IllegalArgumentException("o cannot be null");
}
str = o.toString();
}
J'ai trouvé étrangement que le casting était plus lent que la recherche de table implicite impliquée par l'appel tostring.