Objects: alatka stvorena za rad sa Java objektima
Java klasa Objects je praktična alatka koja sadrži niz statičkih metoda za rad sa objektima. Nalazi se u paketu java.util i uvedena je od Jave 7. Glavna svrha klase Objects je da smanji rizik od izuzetka null pokazivača (NullPointerException) u kôdu, a istovremeno pruža i nekoliko veoma korisnih metoda.
Provera objekta na null
U Javi je sve objekat, pa je provera objekata na null svuda oko nas. Objects-ova metoda isNull služi za proveru da li je objekat null, dok nonNull proverava da li objekat nije null. Na primer:
Integer integer = new Integer(1);
if (Objects.isNull(integer)) {
System.out.println("Objekat je null");
}
if (Objects.nonNull(integer)) {
System.out.println("Objekat nije null");
}Bacanje izuzetka kada je objekat null
Ako želimo da, kada je objekat null, bacimo izuzetak null pokazivača, možemo koristiti Objects-ovu metodu requireNonNull. Na primer:
Integer integer1 = new Integer(128);
Objects.requireNonNull(integer1);
Objects.requireNonNull(integer1, "Parametar ne sme biti null");
Objects.requireNonNull(integer1, () -> "Parametar ne sme biti null");Provera da li su dva objekta jednaka
Često nam treba da proverimo da li su dva objekta jednaka, Objects nam pruža metodu equals koja to vrlo lako ostvaruje:
Integer integer1 = new Integer(1);
Integer integer2 = new Integer(1);
System.out.println(Objects.equals(integer1, integer2));Rezultat izvršavanja:
trueAli ova metoda ima zamku, na primer ako primer promenimo u:
Integer integer1 = new Integer(1);
Long integer2 = new Long(1);
System.out.println(Objects.equals(integer1, integer2));Rezultat izvršavanja:
falseMeđutim, treba napomenuti da, iako sama metoda Objects.equals() služi baš da izbegne zamke, jer može da obradi poređenje sa null vrednostima bez bacanja izuzetka null pokazivača, to ne znači da nema nikakvih potencijalnih problema. Zapravo, jedan potencijalni problem metode Objects.equals() jeste da zavisi od implementacije equals() metode objekata koji se porede.
Kada klasa dva objekta ne implementira equals() metodu na pravi način, metoda Objects.equals() može dati rezultat koji ne odgovara očekivanjima. Na primer:
public class ObjectsDemo1 {
public static void main(String[] args) {
Person person1 = new Person("Chenmo Wang Er", 18);
Person person2 = new Person("Chenmo Wang Er", 18);
System.out.println(Objects.equals(person1, person2)); // izlaz: false
}
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}U gornjem primeru smo kreirali klasu po imenu Person, ali nismo prepisali equals() metodu. Zatim smo kreirali dva Person objekta sa istim svojstvima i upotrebili Objects.equals() metodu da ih uporedimo. Iako su svojstva ova dva objekta ista, izlaz je false. To je zato što Objects.equals() zavisi od equals() metode objekta, a u ovom primeru klasa Person ne implementira equals() metodu na pravi način, pa se podrazumevano koristi equals() metoda klase Object, koja poredi samo da li su reference objekata iste.
Da bismo rešili ovaj problem, moramo u klasi Person prepisati equals() metodu:
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}Sada, kada metodom Objects.equals() uporedimo dva Person objekta sa istim svojstvima, izlaz će biti true, što odgovara našem očekivanju.
Dohvatanje hashCode-a objekta
Ako želite da dohvatite hashCode nekog objekta, možete koristiti Objects-ovu metodu hashCode. Na primer:
String str = new String("Chenmo Wang Er");
System.out.println(Objects.hashCode(str));Rezultat izvršavanja:
867758096Poređenje dva objekta
Metoda compare() služi za poređenje dva objekta, obično za prilagođeno sortiranje. Zahteva komparator (Comparator) kao parametar. Ako je komparator null, koristi se prirodni poredak. Evo primera metode compare():
class ObjectsCompareDemo {
public static void main(String[] args) {
PersonCompare person1 = new PersonCompare("itwanger", 30);
PersonCompare person2 = new PersonCompare("chenqingyang", 25);
Comparator<PersonCompare> ageComparator = Comparator.comparingInt(p -> p.age);
int ageComparisonResult = Objects.compare(person1, person2, ageComparator);
System.out.println("Sortiranje po uzrastu: " + ageComparisonResult); // izlaz: 1 (što znači da age od person1 dolazi posle age od person2)
}
}
class PersonCompare {
String name;
int age;
PersonCompare(String name, int age) {
this.name = name;
this.age = age;
}
}Poređenje dva niza
deepEquals() služi za poređenje dva objekta tipa niz; kada objekti nisu nizovi, ponašanje je istovetno sa equals().
int[] array1 = {1, 2, 3};
int[] array2 = {1, 2, 3};
int[] array3 = {1, 2, 4};
System.out.println(Objects.deepEquals(array1, array2)); // izlaz: true (jer su sadržaji array1 i array2 isti)
System.out.println(Objects.deepEquals(array1, array3)); // izlaz: false (jer su sadržaji array1 i array3 različiti)
// za objekte koji nisu nizovi, deepEquals() se ponaša isto kao equals()
String string1 = "hello";
String string2 = "hello";
String string3 = "world";
System.out.println(Objects.deepEquals(string1, string2)); // izlaz: true (jer su string1 i string2 isti)
System.out.println(Objects.deepEquals(string1, string3)); // izlaz: false (jer su string1 i string3 različiti)Još jedan primer sa dvodimenzionalnim nizom:
String[][] nestedArray1 = {{"A", "B"}, {"C", "D"}};
String[][] nestedArray2 = {{"A", "B"}, {"C", "D"}};
String[][] nestedArray3 = {{"A", "B"}, {"C", "E"}};
System.out.println(Objects.deepEquals(nestedArray1, nestedArray2)); // izlaz: true (jer su elementi ugnježdenih nizova isti)
System.out.println(Objects.deepEquals(nestedArray1, nestedArray3)); // izlaz: false (jer su elementi ugnježdenih nizova različiti)Kratak osvrt
Pored ovde pomenutih metoda, Objects pruža i još neke druge, recimo toString — ako vas zanima, možete probati.

Ukratko, ove metode koje pruža klasa Objects u mnogim situacijama su zaista veoma korisne, mogu da pojednostave kôd i smanje mogućnost grešaka.
