在com.google.protobuf
包中,我找到了Message
界面,声称它将按内容进行比较:
public interface Message extends MessageLite, MessageOrBuilder {
// -----------------------------------------------------------------
// Comparison and hashing
/**
* Compares the specified object with this message for equality. Returns
* <tt>true</tt> if the given object is a message of the same type (as
* defined by {@code getDescriptorForType()}) and has identical values for
* all of its fields. Subclasses must implement this; inheriting
* {@code Object.equals()} is incorrect.
*
* @param other object to be compared for equality with this message
* @return <tt>true</tt> if the specified object is equal to this message
*/
@Override
boolean equals(Object other);
但是我写了测试代码:
public class Test {
public static void main(String args[]) {
UserMidMessage.UserMid.Builder aBuilder = UserMidMessage.UserMid.newBuilder();
aBuilder.setQuery("aaa");
aBuilder.setCateId("bbb");
aBuilder.setType(UserMidMessage.Type.BROWSE);
System.out.println(aBuilder.build() == aBuilder.build());
}
}
它提供了false
。
那么,如何与proto缓冲区消息进行比较?
答案 0 :(得分:9)
==
比较对象引用,它检查两个操作数是否指向同一个对象(不是等效对象,同一个对象 ),因此您可以确保 .build()
每次都创建一个新对象 ......
要使用您发布的代码,您必须与equals
System.out.println(aBuilder.build().equals(aBuilder.build()));
答案 1 :(得分:3)
在Java中,您需要使用equals
方法比较对象,而不是使用==
运算符。问题是==
比较它是否是同一个对象,而equals
方法比较它们是否与类的开发者提供的实现相等。
System.out.println(aBuilder.build().equals(aBuilder.build()));
有关详情,有很多问题已经存在(例如Java == vs equals() confusion。