2012-08-30 5 views
5

Mögliche Duplizieren:
Returning false from Equals methods without Overridinggleich false zurück

Einer meiner Kollegen hat mich gebeten, heute eine Frage, wie unten

schreiben TestEquals Klasse (benutzerdefinierte oder benutzerdefinierte Klasse erwähnt), so dass der untere SOP im Code false druckt.

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

Hinweis: Sie können nicht gleich Methode außer Kraft setzen.

Ich dachte viel, aber konnte die Lösung nicht finden, ohne zu überschreiben gleich. Hat jemand eine Idee, wie es gemacht werden kann?

+7

Dies ist keine Hausaufgaben? –

+4

Ist ** Überlastung ** erlaubt? – home

+2

Das Duplikat erhielt zwei Downvotes und die akzeptierte Antwort nur vier Upvotes. Was macht die Frage diesmal so viel besser? – maba

Antwort

17

Verwendung

public boolean equals(TestEquals equals) { 
    return false 
} 

außer Kraft zu setzen ist gleich müssen Sie den Eingabeparameter des Typs Objekt sein, so dass die obige Code-Schnipsel theorectially nicht überwiegendes ist gleich von der Methode Objekt ist

+5

Es könnte auch eine 'Zeichenfolge' zurückgeben, wenn Sie sich danach gefühlt haben. –

+0

Erstaunlich! 13 upvotes bisher. – maba

+0

@DuncanJones guter Punkt Ich dachte nicht, dass +1 für das zeigen – RNJ

0

Ich weiß nicht, warum sollte Jeder möchte das tun. Aber Sie können eine Methode erstellen, wie unten dargestellt:

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

Wo SuperEquals ist jede übergeordnete Klasse von TestEquals aber nicht Object.

1

Wie oben erwähnt, können Sie eine Methode, wie so schreiben könnte:

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

Darüber hinaus, wenn TestEquals ein anderes Objekt erweitern können:

public TestEquals extends Something { 
} 

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

EDIT: Anscheinend someone else an dieser Idee kam zuerst auf einen anderen Thread, aber ich werde das hier lassen, da dieser Code wesentlich einfacher ist.


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); 
     } 
     } 
    })); 
    } 
} 

Dieser schreckliche Hack nicht oder irgendetwas mit equals zu tun Überlastung außer Kraft setzen, aber der Akt des eine Instanz von TestEquals Schaffung bewirkt, dass die Klasse, die System.out so hüllt zu laden, dass ein nachträglicher Druck, der mit 't' beginnt wird anstelle der ersten 4 Bytes "false" gedruckt werden. (Angenommen, die Standard-Codierung ist nicht etwas sehr Exotisches.)

+0

Ausgezeichnete Idee :) – gontard

+0

+1 für Out-of-the-Box zu denken. – maba

-1

Auf meinem iPad ... Die Strategie sollte so etwas wie ein Attribut zu haben, das jedes Mal geändert wird, wenn Sie es tun. Das wird funktionieren, wenn die Auf das Attribut wird über den Getter On Equals zugegriffen. Sie erwähnen, dass equals nicht überschrieben werden kann, also sollte das Attribut privat sein und die Änderung des Wertes vor und nach dem Lesen des Wertes geschehen, um sicherzustellen, dass es funktioniert, egal ob es der erste oder der zweite Teil des equals ist.

So etwas (sorry für alle Syntaxfehler):

public class TestEquals{ 

private int id; 

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

Der erste Check in Object.equals (Object obj) ist 'if (this == obj) return true'. –