2012-08-30 7 views
5

Possible en double:
Returning false from Equals methods without Overridingégal à return false

un de mes collègues m'a posé une question aujourd'hui comme mentionné ci-dessous

Ecrire TestEquals classe (personnalisée ou classe définie par l'utilisateur) de sorte que le ci-dessous sop dans le code imprime false.

public class Puzzle3 { 
    public static void main(String[] args) { 
    TestEquals testEquals = new TestEquals(); 
    System.out.println(testEquals.equals(testEquals)); 
    } 
} 

Remarque: Vous ne pouvez pas remplacer égale méthode.

Je pensais beaucoup mais ne pouvais pas trouver la solution sans égalisation prioritaire. Quelqu'un at-il une idée de comment cela peut-il être fait?

+7

Ce n'est pas devoirs? –

+4

Est-ce que ** la surcharge ** est autorisée? – home

+2

Le duplicata a obtenu deux downvotes et la réponse acceptée seulement quatre upvotes. Qu'est-ce qui rend la question tellement meilleure cette fois? – maba

Répondre

17

utilisation

public boolean equals(TestEquals equals) { 
    return false 
} 

Pour remplacer vous est égal à besoin le paramètre d'entrée pour être l'objet de type si l'extrait de code ci-dessus est theorectially ne surchargez pas égal à dans la méthode objet

+5

Cela pourrait aussi renvoyer un 'String' si vous en aviez envie. –

+0

Incroyable! 13 upvotes jusqu'à présent. – maba

+0

@DuncanJones bon point que je ne pensais pas que cela +1 pour cette remarque – RNJ

0

Je ne sais pas pourquoi serait Quelqu'un veut le faire. Mais vous pouvez créer une méthode comme indiqué ci-dessous:

public boolean equals(SuperEquals equals) { return false; } 

SuperEquals est une superclasse de TestEquals mais pas Object.

1

Comme mentionné ci-dessus, vous pouvez écrire une méthode comme ceci:

public boolean equals(TestEquals e) { 
    return false; 
} 

En outre, si TestEquals peut étendre un autre objet:

public TestEquals extends Something { 
} 

public Something { 
    @Override public boolean equals(Object o) { 
     return false; 
    } 
} 
11

EDIT: Apparemment someone else est arrivé à cette idée première sur un autre fil, mais je vais laisser cela ici puisque ce code est nettement plus simple.


class TestEquals { 

    static { 
    System.setOut(new PrintStream(new FilterOutputStream(System.out) { 
     public void write(byte[] buf, int pos, int len) throws IOException { 
     if (len >= 4 && buf[pos] == 't') { 
      out.write(new byte[] { 
       (byte) 'f', (byte) 'a', (byte) 'l', (byte) 's', (byte) 'e' 
      }); 
      out.write(buf, pos + 4, len - 4); 
     } else { 
      out.write(buf, pos, len); 
     } 
     } 
    })); 
    } 
} 

Cette horrible hack ne remplace pas ou surcharge rien à voir avec equals, mais l'acte de création d'une instance de TestEquals provoque la classe à charge qui enveloppe System.out afin que toute impression ultérieure qui commence par 't' entraînera l'impression de "false" au lieu des 4 premiers octets. (En supposant que l'encodage par défaut n'est pas quelque chose de super-exotique.)

+0

idée Excelent :) – gontard

+0

+1 pour penser hors des sentiers battus. – maba

-1

Sur mon iPad ... La stratégie devrait être quelque chose comme avoir un attribut aun qui est modifié chaque fois que vous le faites .. cela fonctionnera si le l'attribut est accessible via le getter sur égal. Vous mentionnez que equals ne peut pas être override donc l'attribut devrait être privé et la modification de la valeur se produire avant et après que la valeur soit lue, pour s'assurer que cela fonctionne peu importe si c'est la première ou la deuxième partie des égaux.

Quelque chose comme (désolé pour les erreurs de syntaxe):

public class TestEquals{ 

private int id; 

public int getId(){ 
    int temp; 
    id++; 
    temp=id; 
    id++; 
    return temp; 
} 
} 
+0

La première vérification dans Object.equals (Object obj) est 'if (this == obj) return true'. –