हालांकि दूसरा विकल्प अधिक आकर्षक है (क्योंकि यह कोड की केवल एक पंक्ति है) मैं पहला विकल्प चुनूंगा।
कारण बस प्रदर्शन है। एक छोटे से परीक्षण चलाने के बाद मुझे उनके बीच एक बहुत अच्छा समय अंतर मिला।
package equalsbuildertest;
import java.math.BigDecimal;
import java.util.Date;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Class1 {
private int field1;
private boolean field2;
private BigDecimal field3;
private String field4;
private Date field5;
private long field6;
public Class1(int field1, boolean field2, BigDecimal field3, String field4,
Date field5, long field6) {
super();
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
this.field4 = field4;
this.field5 = field5;
this.field6 = field6;
}
public Class1() {
super();
}
public int getField1() {
return field1;
}
public void setField1(int field1) {
this.field1 = field1;
}
public boolean isField2() {
return field2;
}
public void setField2(boolean field2) {
this.field2 = field2;
}
public BigDecimal getField3() {
return field3;
}
public void setField3(BigDecimal field3) {
this.field3 = field3;
}
public String getField4() {
return field4;
}
public void setField4(String field4) {
this.field4 = field4;
}
public Date getField5() {
return field5;
}
public void setField5(Date field5) {
this.field5 = field5;
}
public long getField6() {
return field6;
}
public void setField6(long field6) {
this.field6 = field6;
}
@Override
public boolean equals(Object o) {
return EqualsBuilder.reflectionEquals(this, o);
}
@Override
public int hashCode() {
return HashCodeBuilder.reflectionHashCode(this);
}
}
और:: द्वितीय श्रेणी काफी पहले एक रूप में ही है
package equalsbuildertest;
import java.math.BigDecimal;
import java.util.Date;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
public class Class2 {
private int field1;
private boolean field2;
private BigDecimal field3;
private String field4;
private Date field5;
private long field6;
public Class2(int field1, boolean field2, BigDecimal field3, String field4,
Date field5, long field6) {
super();
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
this.field4 = field4;
this.field5 = field5;
this.field6 = field6;
}
public Class2() {
super();
}
public int getField1() {
return field1;
}
public void setField1(int field1) {
this.field1 = field1;
}
public boolean isField2() {
return field2;
}
public void setField2(boolean field2) {
this.field2 = field2;
}
public BigDecimal getField3() {
return field3;
}
public void setField3(BigDecimal field3) {
this.field3 = field3;
}
public String getField4() {
return field4;
}
public void setField4(String field4) {
this.field4 = field4;
}
public Date getField5() {
return field5;
}
public void setField5(Date field5) {
this.field5 = field5;
}
public long getField6() {
return field6;
}
public void setField6(long field6) {
this.field6 = field6;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Class2)) {
return false;
}
Class2 other = (Class2) obj;
EqualsBuilder builder = new EqualsBuilder();
builder.append(field1, other.field1);
builder.append(field2, other.field2);
builder.append(field3, other.field3);
builder.append(field4, other.field4);
builder.append(field5, other.field5);
builder.append(field6, other.field6);
return builder.isEquals();
}
@Override
public int hashCode() {
HashCodeBuilder builder = new HashCodeBuilder();
builder.append(getField1());
builder.append(isField2());
builder.append(getField3());
builder.append(getField4());
builder.append(getField5());
builder.append(getField6());
return builder.hashCode();
};
}
कि
आदेश एक तरह से समय की एक विचार पाने के लिए, मैं इस दो सरल कक्षाओं बनाया , लेकिन विभिन्न बराबर और हैशकोड के साथ।
package equalsbuildertest;
import static org.junit.Assert.*;
import java.math.BigDecimal;
import java.util.Date;
import org.junit.Test;
public class EqualsBuilderTest {
@Test
public void test1() {
Class1 class1a = new Class1(1, true, new BigDecimal(0), "String", new Date(), 1L);
Class1 class1b = new Class1(1, true, new BigDecimal(0), "String", new Date(), 1L);
for (int i = 0; i < 1000000; i++) {
assertEquals(class1a, class1b);
}
}
@Test
public void test2() {
Class2 class2a = new Class2(1, true, new BigDecimal(0), "String", new Date(), 1L);
Class2 class2b = new Class2(1, true, new BigDecimal(0), "String", new Date(), 1L);
for (int i = 0; i < 1000000; i++) {
assertEquals(class2a, class2b);
}
}
}
परीक्षण बहुत सरल कर रहे हैं और केवल समय को मापने के लिए कार्य करता है:
उसके बाद, मैं निम्नलिखित परीक्षण बनाया।
परिणाम थे निम्नलिखित:
- test1 (2,024 रों)
- test2 (0039 रों)
मैं उन्हें चुना है आदेश के लिए पूरी तरह से बराबर हो सबसे बड़ा समय। यदि आप NotEquals स्थितियों के साथ परीक्षण करना चुनते हैं तो आपके पास कम समय होगा, लेकिन बहुत बड़ा समय अंतर भी बनाएगा।
मैं फेडोरा 21 और ग्रहण लूना के साथ एक 64-बिट इंटेल कोर i5-3317U सीपीयू @ 1.70GHz x4 पर इस परीक्षण चला।
निष्कर्ष में, मैं कोड की कुछ पंक्तियों को सहेजने के लिए इस तरह के एक महान प्रदर्शन अंतर को जोखिम नहीं उठाऊंगा जिसे आप शायद टेम्पलेट का उपयोग करके टाइप नहीं कर सकते हैं (विंडोज़ के तहत ग्रहण में -> प्राथमिकता जावा में मिलती है -> संपादक -> टेम्पलेट) इस जैसे:
${:import(org.apache.commons.lang3.builder.HashCodeBuilder, org.apache.commons.lang3.builder.EqualsBuilder)}
@Override
public int hashCode() {
HashCodeBuilder hashCodeBuilder = new HashCodeBuilder();
hashCodeBuilder.append(${field1:field});
hashCodeBuilder.append(${field2:field});
hashCodeBuilder.append(${field3:field});
hashCodeBuilder.append(${field4:field});
hashCodeBuilder.append(${field5:field});
return hashCodeBuilder.toHashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
${enclosing_type} rhs = (${enclosing_type}) obj;
EqualsBuilder equalsBuilder = new EqualsBuilder();
equalsBuilder.append(${field1}, rhs.${field1});
equalsBuilder.append(${field2}, rhs.${field2});
equalsBuilder.append(${field3}, rhs.${field3});
equalsBuilder.append(${field4}, rhs.${field4});
equalsBuilder.append(${field5}, rhs.${field5});${cursor}
return equalsBuilder.isEquals();
}
आपको नीचे दिए गए एक प्रश्न को स्वीकार करने की आवश्यकता है जो आपके प्रश्न के सूट है। मेरे पास भी एक ही सवाल है और यह उचित नहीं ठहरा सकता है कि नीचे दिए गए उत्तरों से अनुष्ठान कौन सा है। किसी भी उत्तर को स्वीकार करने का प्रयास करें। – developer
उन्हें नीचे दिए गए उत्तरों में से एक को स्वीकार करने की आवश्यकता क्यों है? अगर प्रश्न को ओप की संतुष्टि का उत्तर नहीं दिया गया है, तो क्यों स्वीकार करें। मैं कहूंगा कि जब तक कोई कोई अच्छा जवाब नहीं देता तब तक इसे खोलें। – Churk