簡體   English   中英

Java:等於檢查接口而不是類

[英]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:

  • 接口I1和I2,
  • B表示I2和I3
  • C表示I1和I3。

然后你可能會遇到這種情況:

  • 由於I2,A等於B.
  • 由於I3,B等於C.
  • 但是:由於I3,A不等於C.

這會違反傳遞約束! 這可能導致很難找到錯誤!

這只是一個警告,在您開始將其聲明為主要架構風格之前要三思。

添加:

相反,我建議實現類似於比較器的東西,但不要比較,但要檢查“等於”,它的含義類似於“等於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM