Interviewantworten II – die erste Antwort

Die Frage war, warum Object.hashCode() und Object.equals(Object) immer beide überschrieben werden sollten.

Die Antwort findet sich direkt in der Javadoc-Dokumentation von Object.hashCode():

If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.

Vereinfacht gesagt: Überschreibt man nur equals() und es werden zwei unterschiedliche Instanzen einer Klasse verglichen, die laut equals() aber gleich sind, so bricht man den Kontrakt von Object.hashCode(). Die beiden HashCodes wären unterschiedlich, obwohl die Objekte nach equals() gleich sind.

Um das Ganze ein wenig praktischer zu beschreiben, nehmen wir folgende Klasse an:

public class Person {
  private String firstName;
  private String lastName;
  private Date dateOfBirth;
  private String favoriteBeer;

  // ...getter/setter

  // wir nehmen an, zwei Personen sind identisch, wenn sie gleich heißen und am gleichen Tag geboren wurden

  // bitte IMMER @Override nutzen, wenn Java >= 1.5 verwendet wird!
  @Override
  public boolean equals(Object o) {
    Person otherPerson = (Person) o;
    return
      firstName.equals(o.getFirstName()) &&
      lastName.equals(o.getLastName()) &&
      dateOfBirth.equals(o.getDateOfBirth());
  }
}

In obigem Beispiel wurde nur equals überschrieben und dieser Vergleich macht durchaus Sinn. Aber was passiert, wenn wir zwei Personen gleichen Namens und mit gleichem Geburtsdatum in ein HashSet einfügen wollen? Da das HashSet – wie der Name schon sagt – den HashCode eines Objekts als Vergleichsfunktion heranzieht um zu bestimmen, ob dieses Objekt schon einmal im Set vorhanden ist, würden problemlos beide Objekte im Set abgelegt werden. Und das, obwohl sie doch equals() sind! Hier hilft natürlich, eine .hashCode()-Methode zu schreiben, die genau die gleichen Felder berücksichtigt wie .equals().

Das Erstellen von hashCode und equals ist übrigens mit IDEs einfach gemacht. Unter Eclipse kann man über Source -> generate hashCode() and equals() komfortabel auswählen, welche Felder in die Methoden einbezogen werden sollen. Andere IDEs bieten vermutlich ähnliche Funktionen. Programmatisch kann man über den EqualsBuilder respektive den HashCodeBuilder aus den Apache Commons diese Sachen einfach erledigen.

Aus aktuellem Anlass: Spam-Versand über GMX

Aus aktuellem Anlass hier eine Meldung zu Spam-Versand über GMX. Wer ungewollt vielen Freunden Spam geschickt hat oder wer von jemandem eine Spam-Nachricht von dessen GMX-E-Mail bekommen hat, bitte dem- oder derjenigen Bescheid geben:
http://www.heise.de/newsticker/meldung/Spam-Versand-ueber-gehackte-GMX-Konten-1635150.html

Interviewfragen II – Java

Hier mal einige Java-spezifische Interviewfragen, die ich teilweise selber erfahren habe, teilweise ich mir aber auch einfach nur ausgedacht habe. Dass sie daher etwas Web-Programmierungs-lastig sind bitte ich zu entschuldigen.

  • Warum sollte
    Object.equals(Object)

    immer überschrieben werden, wenn auch

    Object.hashCode()

    überschrieben wird?

  • Was sind die Unterschiede eines Request-Response-basierten Web-Frameworks im Vergleich zu einem komponentenbasierten Framework? Kennen Sie Beispiele für das eine oder das andere?
  • Was ist der Unterschied zwischen einem Application Server (wie z.B. JBoss AS) und einem Servlet-Container wie z.B. Tomcat?
  • Welche Einsatzszenarien fallen Ihnen für eine Message-Queue ein?
  • Welche Tools kennen Sie, mit denen die Zusammenarbeit zwischen mehreren Entwicklern, Testern und anderen Projektbeteiligten verbessert werden kann?

Diese Fragen werde ich der Reihe nach beantworten, wobei natürlich auch vorab schon Antworten und Vorschläge erwünscht sind!

PHP 5.2 und FileInfo – NOT!

Nachdem ich feststellen musste, dass 1&1 auf seinen Webspaces nur PHP 5.2.17 (veröffentlicht im Januar 2011 und seit März 2011 nicht mehr unterstützt!) bereitstellt, bin ich damit auf einige Probleme gestoßen. Konkret ging es um die Funktionalitäten aus dem FileInfo-Modul. Seit PHP 5.3 ist dies der empfohlene und eingebaute Weg, um Informationen über den Typ einer Datei herauszufinden. Genutzt habe ich das um sicherzustellen, dass eine Datei auch wirklich ein Bild ist, das anschließend weiterverarbeitet wird.

Wie gesagt unterstützt PHP 5.2 diese Funktionen nicht direkt. Es gibt allerdings eine PECL-Erweiterung, mit der man dies nachrüsten kann. Das Problem hierbei ist jedoch, dass zur Installation ein direkter Zugang zum PHP-System notwendig ist, zum Beispiel per SSH. Da dies in diesem Fall nicht möglich ist, entfällt dies.

Die nächste Möglichkeit, den Mime-Type einer Datei unter PHP < 5.3 zu bestimmen wäre mit der Funktion mime_content_type. Ausprobiert – aber nein, funktioniert natürlich auch nicht! Warum? Nun ja, dafür wird die Erweiterung mime_magic benötigt – und die ist bei 1&1 natürlich auch nicht installiert!

Also bleibt noch die schöne Möglichkeit, das ganze über schöne try-catch-Blöcke zu steuern. Womit man beim Anti-Pattern des „Control Flow with Exceptions“ ist. Großartig!

Danke 1&1 dass ihr auch über ein Jahr nach Ende der Unterstützung für PHP 5.2 noch immer nicht auf Version 5.3 aktualisiert habt! Argh!

 

Google und das volle Internet oder: Warum man die Piraten wählt

Wenn normale Menschen sich an etwas probieren, von dem sie keine Ahnung haben, dann fällt einem als erstes immer ein bekannter Spruch eines bekannten Comedians ein:

Wenn man keine Ahnung hat, einfach mal die Fresse halten.

Es gibt nur leider einen gesellschaftlichen Bereich, in dem dieses Motto komplett ignoriert wird: Die Politik. Folgendes Video zeigt dies mal wieder eindrücklich:

Das wirklich Erschreckende daran ist: Eben jene Menschen, die schlichtweg keine Ahnung haben, sind für oder gegen Netzsperren, eben jene Menschen maßen sich an über Dinge zu entscheiden, über die sie nicht einmal grundlegende Kenntnisse haben!

Warum also sollte ich bei einem Thema, was mir persönlich sehr wichtig ist, diese Partei wählen? Ist da irgendwer, der Ahnung hat? Man glaubt es nicht wirklich.

Genau so, wie vor Jahrzehnten die Grünen mit ihrer Umweltpolitik in eine Nische geschlagen haben, tun es heute die Piraten: sie besetzen die Nische „Internet“. Dort, bei der Piratenpartei, sind Leute, die vom Thema Internet (und vermutlich auch Fax) Ahnung haben. Sie sind sehr viel kompetenter, wenn es um Entscheidungen rund um das weltweite (und NICHT nationale) Netz geht. Kein Wunder also, dass sie immer wieder Achtungserfolge erzielen – zurecht!