![](/img/trans.png)
[英]How to make java interface / abstract class that uses per-field equals instead of default equals?
[英]Java: equals check on interface instead of class
我有一個案例,我有一個代表實體的Java接口。 該接口在2個不同的類中實現。 因此,我需要一個測試方法 - 如果2個類有一個共同的接口 - 如果這兩個類的所有Getter-Values都是相同的
如果兩者都是真的,那么在我需要的情況下,它們會平等地通過。 (注意,我不知道他們實現了哪個界面,有一些可能)
這是不可能的,或者我需要提供接口,然后檢查這兩個類是否實現它?
謝謝你的幫助,邁克爾
注意:如果一個類有不同的接口,那么這可能會破壞約束:
equals方法在非null對象引用上實現等價關系:
- 它是自反的:對於任何非空引用值x,x.equals(x)應該返回true。
- 它是對稱的:對於任何非空引用值x和y,當且僅當y.equals(x)返回true時,x.equals(y)才應返回true。
- 它是傳遞性的:對於任何非空引用值x,y和z,如果x.equals(y)返回true而y.equals(z)返回true,則x.equals(z)應返回true。
- 它是一致的:對於任何非空引用值x和y,x.equals(y)的多次調用始終返回true或始終返回false,前提是不修改在對象的equals比較中使用的信息。
@see:Object.equals的java doc
如果你有三個類A,B,C樹Itnerfaces I1,I2,I3:
然后你可能會遇到這種情況:
這會違反傳遞約束! 這可能導致很難找到錯誤!
這只是一個警告,在您開始將其聲明為主要架構風格之前要三思。
添加:
相反,我建議實現類似於比較器的東西,但不要比較,但要檢查“等於”,它的含義類似於“等於X”(其中X是例如你的一個接口)
java.lang.Class
有一個名為getInterfaces
的方法,它允許您獲取對象實現的接口。 您可以獲取要比較的對象的接口列表,然后進行比較。
Class<?>[] interfaces1 = obj1.getClass().getInterfaces();
Class<??[] interfaces2 = obj2.getClass().getInterfaces();
// iterate through the arrays to figure out which interfaces are common across the objects
然后對於常見的,使用反射列出getter並比較getter的值。
一般來說,假設您只有X個接口的實現並不是一個好的假設,因為接口背后的想法是您並不真正關心底層實現。
if ( oneClass instanceof Interface1 && secondClass instanceof Interface2)
有一種叫做isAssignableFrom的方法
Class.isAssignableFrom(接口);
你需要自己寫這個,但它不應該太糟糕。 你需要使用反射。
首先,您需要每個對象的Class。 使用Object#getClass()
獲取Class。
其次,使用Class[] Class#getInterfaces()
來獲取兩個類的接口並查找匹配項。
然后,如果找到匹配項,請使用Method[] Class#getMethods()
來查找它們共有的接口的所有方法。
對於這些方法中的每一種,使用Method#getName()
來查看它們是以“get”開頭還是使用Method#getParameterTypes()
來獲取方法的參數類型。 對於典型的“getter”,它將具有0個參數。
然后,要執行這些方法,請為每個Method#invoke(Object)
調用Method#invoke(Object)
。 這將調用該方法並返回該getter的值。 然后,您可以比較這些值並確保它們匹配。
如果您無法知道對象可能正在實現哪個接口,我建議您創建一個傘形接口。
public interface MyGeneralInterface {}
public interface SpecificInterface1 implements MyGeneralInterface {}
public interface SpecificInterface2 implements MyGeneralInterface {}
public class SpecificClass1 implements SpecificInterface1 {}
public class SpecificClass2 implements SpecificInterface2 {}
然后正如Jigar所說,使用instanceof
。
if(myobj instanceof MyGeneralInterface) {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.