471 votes

La meilleure façon de "nier" une instanceof

Je me demandais s'il existait un moyen plus efficace ou plus simple d'annuler une instanceof en Java. En fait, je fais quelque chose comme :

if(!(str instanceof String)) { /* do Something */ }

Mais je pense qu'une "belle" syntaxe pour faire cela devrait exister.

Quelqu'un sait-il s'il existe, et à quoi ressemble la syntaxe ?


EDIT : Par beau, je pourrais dire quelque chose comme ça :

if(str !instanceof String) { /* do Something */ } // compilation fails

29 votes

Je déteste les règles de préséance pour instanceof tellement...

4 votes

Vous pouvez toujours créer une variable, quelque chose comme boolean strIsString = str instanceof String; ...

0 votes

Oui, @Baqueta, c'est une option. Mais, quelles différences pourraient se produire dans l'utilisation de la mémoire dans une syntaxe ou une autre ?

352voto

maerics Points 47743

Non, il n'y a pas de meilleure façon, la vôtre est canonique.

152voto

Natix Points 4421

Je ne sais pas ce que vous imaginez quand vous dites "beau", mais que pensez-vous de ça ? Personnellement, je pense que c'est pire que la forme classique que tu as postée, mais quelqu'un pourrait l'aimer...

if (str instanceof String == false) { /* ... */ }

4 votes

Pour la double logique, vous pouvez utiliser != true au lieu de == false :D

1 votes

Voir cela m'aide à comprendre que if(!(str instanceof String)) est la seule bonne voie, et je dois arrêter de penser à des alternatives

0 votes

J'aime cette solution car je ne suis pas obligé de constituer une pile de métal en le lisant !

64voto

dacwe Points 26160

Vous pourriez utiliser le Class.isInstance méthode :

if(!String.class.isInstance(str)) { /* do Something */ }

... mais c'est toujours nié et assez laid.

5 votes

Est un peu mieux, l'excès de parenthèses rend le code laid, IMHO.

0 votes

N'est-ce pas beaucoup plus lent ?

4 votes

Son comportement est différent. Le mot-clé instanceof inclut les sous-classes, mais pas la méthode. Vous devez utiliser Class.isAssignableFrom pour reproduire le comportement.

30voto

Peter Lawrey Points 229686

En général, vous ne voulez pas juste un if mais un else également.

if(!(str instanceof String)) { /* do Something */ } 
else { /* do something else */ }

peut s'écrire comme suit

if(str instanceof String) { /* do Something else */ } 
else { /* do something */ }

Ou vous pouvez écrire le code de manière à ne pas avoir besoin de savoir s'il s'agit d'une chaîne de caractères ou non, par ex.

if(!(str instanceof String)) { str = str.toString(); } 

peut s'écrire comme suit

str = str.toString();

0 votes

Je pense que c'est la meilleure réponse (première partie).

0 votes

Cela doit être une réponse acceptable car IntelliJ a également suggéré cette méthode.

13voto

Pablo Grisafi Points 2674

Si vous pouvez utiliser des importations statiques, et que votre code moral les autorise

public class ObjectUtils {
    private final Object obj;
    private ObjectUtils(Object obj) {
        this.obj = obj;
    }

    public static ObjectUtils thisObj(Object obj){
        return new ObjectUtils(obj);
    }

    public boolean isNotA(Class<?> clazz){
        return !clazz.isInstance(obj);
    }
}

Et puis...

import static notinstanceof.ObjectUtils.*;

public class Main {

    public static void main(String[] args) {
        String a = "";
        if (thisObj(a).isNotA(String.class)) {
            System.out.println("It is not a String");
        }
        if (thisObj(a).isNotA(Integer.class)) {
            System.out.println("It is not an Integer");
        }
    }    
}

C'est juste un exercice d'interface fluide, je ne l'utiliserais jamais dans un code réel !
Choisissez votre méthode classique, cela ne perturbera personne d'autre qui lira votre code !

0 votes

Je n'aime pas les importations statiques en tout cas, merci d'avoir essayé de m'aider :)

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