Tipo Java sicuro è uguale a()


Perché non esiste un equals() sicuro per il tipo in Java? Penserei che aiuterebbe a rilevare alcuni errori durante la compilazione invece di errori di runtime successivi.

Come esempio banale considera questo:

class Person {
    Integer birthYear;
} 

class Car {
    Long releaseYear;
}

Avere un metodo per prendere in una persona e collezione di auto e supponiamo di elencare tutte le auto rilasciate nello stesso anno in cui la persona è nata potrebbe finire per usare:

if (person.birthYear.equals(car.releaseYear)) {
...magic happens...
}

Ma nessuna magia sarebbe mai accaduta usando questo. Anche se i campi sono dello stesso tipo durante la creazione di il codice potrebbe essere modificato in un secondo momento senza ottenere errori di compilazione sul codice di confronto.

Quale sarebbe la migliore pratica per evitare questo tipo di problemi?

Author: Nayuki, 2016-03-10

1 answers

In base alla progettazione, il metodo equals() di Java prende un Object in modo da poter creare una raccolta eterogenea di oggetti e confrontarli l'uno contro l'altro per l'uguaglianza.

Ad esempio, potresti avere un elenco di oggetti arbitrari:

List<Object> lst = new ArrayList<>();
lst.add("abc");
lst.add(123);  // Integer
lst.add(456L);  // Long

Quindi il fatto che equals() prenda un Object significa che puoi implementare:

void indexOf(List<Object> lst, Object target) {
    for (int i = 0; i < lst.size(); i++) {
        if (lst.get(i).equals(target))
            return i;
    }
    return -1;
}

Per rispondere specificamente alla tua preoccupazione, l'unico modo per essere "type-safe" è definire un nuovo nome di metodo come strictEquals() e implementare il parametro solo con il tuo digitare, non il tipo Object. Ad esempio:

class Person {
    boolean strictEquals(Person other) { ... }
}

class Car {
    boolean strictEquals(Car other) { ... }
}

Per quanto riguarda l'uso di Integer e Longcome campi, non farlo. Utilizzare invece i tipi primitivi int e long e utilizzare l'operatore == per confrontare i valori. Questo ha una serie di vantaggi, come prestazioni migliori, no NullPointerException e la possibilità di confrontare int con long correttamente (mentre Integer.equals(Long) restituirà sempre false a causa di tipi diversi, anche se gli oggetti hanno lo stesso valore numerico).

 2
Author: Nayuki, 2016-03-10 17:24:33