Ing kirim iki aku bakal njelaske nganggo bentuk garis pangerten babagan cara Overriding
Apache Commons nyedhiyakake rong kelas helper sing apik kanggo metode panggilan
hashCode()
lan equals()
. Aku pengin ngomong babagan implementasine standar, uga carane ngatasi kanthi bener. Aku uga bakal nulis babagan ngleksanakake metode kasebut nggunakake kelas helper paket Apache Common. Isi postingan iki:
- Nggunakake
hashCode()
lanequals()
. - Ngganti prilaku standar.
- Overriding
hashCode()
lanequals()
nggunakake Apache Commons Lang. - Soko sing penting kanggo elinga.
- Perhatian Khusus Nalika Nggunakake ORM.
hashCode()
lan equals()
ditetepake ing kelas Object
, yaiku kelas induk kanggo obyek java. Mulane, kabeh obyek java marisi implementasine standar saka cara iki.
Nggunakake hashCode () lan padha ()
Cara ikihashCode()
digunakake kanggo njupuk nomer integer unik kanggo obyek tartamtu. Nalika obyek kudu disimpen minangka struktur data ing tabel hash (uga disebut ember), nomer iki digunakake kanggo nemtokake lokasi ing tabel kasebut. Kanthi gawan, cara hashCode()
kanggo obyek ngasilake nomer lokasi memori ing ngendi obyek kasebut disimpen. Cara kasebut equals()
, kaya jenenge, digunakake kanggo mriksa kesetaraan rong obyek. Implementasi standar metode iki mung mriksa referensi saka rong obyek kanggo ndeleng manawa padha.
Overriding prilaku standar
Kabèh bisa dianggo kanthi becik anggere sampeyan ora ngilangi salah sawijining metode ing kelas sampeyan. Nanging kadhangkala aplikasi kudu ngganti prilaku standar sawetara obyek. Ayo njupuk conto ing ngendi sampeyan duweEmployee
. Ayo nulis struktur minimal saka kelas kasebut.
public class Employee
{
private Integer id;
private String firstname;
private String lastName;
private String department;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
Kelas sing diterangake ing ndhuwur Employee
duwe sawetara atribut dhasar lan metode accessor. Saiki ayo goleki kahanan sing gampang kanggo mbandhingake rong obyek kelas Employee
.
public class EqualsTest {
public static void main(String[] args) {
Employee e1 = new Employee();
Employee e2 = new Employee();
e1.setId(100);
e2.setId(100);
//Печатает false в консоли
System.out.println(e1.equals(e2));
}
}
Ora njupuk clairvoyant kanggo guess sing cara ndhuwur bakal bali "palsu". Nanging apa iki bener, amarga loro obyek kasebut padha? Ing aplikasi wektu nyata, cara kasebut kudu ngasilake bener. Kanggo entuk prilaku sing bener, kita kudu ngilangi cara kasebut equals()
, kaya ing ngisor iki:
public boolean equals(Object o) {
if(o == null)
{
return false;
}
if (o == this)
{
return true;
}
if (getClass() != o.getClass())
{
return false;
}
Employee e = (Employee) o;
return (this.getId() == e.getId());
}
Tambahake metode iki menyang kelas sampeyan Employee
lan priksa kesetaraan bakal bali "bener". Nanging, apa kita wis nindakake kabeh? durung. Ayo nyoba kelas sing diowahi kanthi cara liyane.
import java.util.HashSet;
import java.util.Set;
public class EqualsTest
{
public static void main(String[] args)
{
Employee e1 = new Employee();
Employee e2 = new Employee();
e1.setId(100);
e2.setId(100);
//Печатает 'true'
System.out.println(e1.equals(e2));
Set employees = new HashSet();
employees.add(e1);
employees.add(e2);
//Печатает два an object
System.out.println(employees);
}
}
Printah kasebut System.out.println(employee)
nyithak rong obyek. Yen loro obyek padha padha, lan Set
mung obyek unik sing ana ing, banjur HashSet
kudu ana mung siji Kayata nang, i.e. loro obyek nuduhake conto sing padha ing kelas Employee
. Apa sing wis kita lakoni? Kita ora kejawab cara penting nomer loro hashCode()
. Minangka dokumentasi java ngandika, yen sampeyan ngilangi cara equals()
, sampeyan kudu ngilangi metode kasebut hashCode()
. Dadi ayo nambah metode liyane ing kelas kita Employee
.
@Override
public int hashCode()
{
final int PRIME = 31;
int result = 1;
result = PRIME * result + getId();
return result;
}
Kita nambahake metode iki sapisan ing kelas kita, lan mung siji obyek sing bakal dicithak, lan kanthi mangkono, mriksa kesetaraan e1 lan e2 nuduhake bener.
Overriding hashCode()
lan equals()
nggunakake Apache Commons Lang
Apache Commons nyedhiyakake rong kelas helper sing apik kanggo metode panggilan hashCode()
lan equals()
. Ing ngisor iki kita ndeleng panggunaan:
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Employee
{
private Integer id;
private String firstname;
private String lastName;
private String department;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
@Override
public int hashCode()
{
final int PRIME = 31;
return new HashCodeBuilder(getId()%2==0?getId()+1:getId(), PRIME).
toHashCode();
}
@Override
public boolean equals(Object o) {
if (o == null)
return false;
if (o == this)
return true;
if (o.getClass() != getClass())
return false;
Employee e = (Employee) o;
return new EqualsBuilder().
append(getId(), e.getId()).
isEquals();
}
}
Ing tangan liyane, yen sampeyan nggunakake salah siji saka editors kode, padha uga kudu bisa nelpon munggah sawetara struktur becik kanggo sampeyan. Contone, yen ing Eclipse IDE sampeyan klik-tengen ing kelas >> sumber> Generating hashCode () lan padha () ... bakal generate implementasine apik banget kanggo sampeyan. Soko sing penting kanggo elinga.
- Tansah nggunakake atribut obyek sing padha kanggo nelpon loro lan
hashCode()
lanequals()
. Mung ing kasus kita, kita digunakakeemployee id
. - Cara kasebut
equals()
kudu terus-terusan (yen obyek ora diganti, metode kasebut kudu ngasilake nilai sing padha). - Kapan
a.equals(b)
, banjura.hashCode()
kudu padha karob.hashCode()
. - Yen sampeyan ngilangi salah siji cara, sampeyan kudu ngilangi cara liya.
Perhatian Khusus Nalika Nggunakake ORM
Yen sampeyan ngurusi ORM (ru.wikipedia.org/wiki/ORM), banjur gunakake getter lan aja nganggo referensi lapanganhashCode()
. equals()
Iki amarga ing ORM, sawayah-wayah kolom dimuat nggunakake lazy load lan ora bisa diakses nganti getter kasebut diarani. Contone, ing kelas kita Employee
, kita nggunakake e1.id == e2.id
. Bisa uga yen i
kolom d dimuat kanthi nggunakake lazy loading. Salah sawijining lapangan bisa uga ana 0 utawa null lan kita bakal entuk prilaku sing salah. Nanging, yen , digunakake e1.getId() == e2.getId()
, kita bisa yakin sanajan lapangan dimuat nggunakake loading puguh; nelpon getter bakal populate lapangan pisanan. Sing kabeh aku ngerti babagan hashCode()
lan metode equals()
. Mugi iki mbantu wong nang endi wae. Sukses kuliahmu!! ps Iki nyoba pisanan ing terjemahan. Aku nyoba kanggo ngirim kabeh minangka cedhak karo apa sing penulis arep ngomong. Yen sampeyan duwe komentar, tulis ing komentar. Aja ngadili kanthi ketat :-))) Artikel asli
GO TO FULL VERSION