我有一个案例,我有一个代表实体的Java接口。该接口在2个不同的类中实现。 因此,我需要一种测试方法 - 如果2个类有一个共同的接口 - 如果这两个类的所有Getter-Values都相同
如果两者都是真的,那么在我需要的情况下,它们会相等。 (注意,我不知道他们实现了哪个界面,有一些可能)
这是否可行,或者我是否需要提供接口,然后检查这两个类是否实现了它?
感谢您的帮助, 迈克尔
答案 0 :(得分:5)
注意:如果一个类有不同的接口,那么这可能会破坏约束:
equals方法实现了一个 非空的等价关系 对象引用:
- 它是自反的:对于任何非空引用值x,x.equals(x)应该是 返回true。
- 它是对称的:对于任何非空参考值x和y,x.equals(y) 应该返回true,当且仅当 y.equals(x)返回true。
- 它是传递性的:对于任何非空参考值x,y和z,if x.equals(y)返回true和 y.equals(z)返回true,然后 x.equals(z)应该返回true。
- 一致:对于任何非空引用值x和y,为多个 调用x.equals(y) 一贯回归真实或 如果没有,则一直返回虚假 用于等比较的信息 在对象上进行了修改。
@see:Object.equals的java doc
如果你有三个类A,B,C树Itnerfaces I1,I2,I3:
然后你可能会遇到这种情况:
这会违反传递约束!这可能导致很难找到错误!
这只是一个警告,在您开始将其声明为主要架构风格之前要三思。
<强>加了:强>
相反,我建议实现与比较器类似的东西,但不要进行比较,但要检查“等于”,其含义类似于“等于X”(其中X是例如你的一个)接口)
答案 1 :(得分:1)
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
然后对于常见的,使用反射列出吸气剂并比较吸气剂的值。
一般来说,假设您只有X个接口的实现并不是一个好的假设,因为接口背后的想法是您并不真正关心底层实现。
答案 2 :(得分:0)
if ( oneClass instanceof Interface1 && secondClass instanceof Interface2)
有一种名为isAssignableFrom
的方法Class.isAssignableFrom(界面);
答案 3 :(得分:0)
你需要自己写这个,但这不应该太糟糕。你需要使用反射。
首先,您需要每个对象的Class。使用Object#getClass()
获取课程。
其次,使用Class[] Class#getInterfaces()
获取两个类的接口并查找匹配项。
然后,如果找到匹配项,请使用Method[] Class#getMethods()
查找它们共有的接口的所有方法。
对于这些方法中的每一种,使用Method#getName()
查看它们是以“get”开头还是Method#getParameterTypes()
来获取方法的参数类型。对于典型的“getter”,它将有0个参数。
然后,要执行这些方法,请为每个对象调用Method#invoke(Object)
。这将调用该方法并返回该getter的值。然后,您可以比较这些值并确保它们匹配。
答案 4 :(得分:-2)
如果您无法知道对象可能正在实现哪个接口,我建议您创建一个伞形接口。
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) {}