2015-05-25 93 views
4

在包com.google.protobuf我發現了一個Message接口,它聲稱將通過內容比較:如何比較Java中的兩個proto緩衝區消息?

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

那麼,如何比較原始緩衝區信息?

+3

比較,如果你想調用'equals',你應該做的正是 - 您正在使用''== ...代替 –

回答

6

==比較對象引用,它檢查是否兩個操作數指向同一對象不等價的對象,同一對象),所以你可以肯定的是.build()使得每次一個新的對象......

要使用您發佈的代碼,你必須用equals

System.out.println(aBuilder.build().equals(aBuilder.build()));   
3

在Java中,您需要將對象與equals方法進行比較,而不是與==運算符進行比較。問題是==比較它是否是相同的對象,而equals方法比較它們是否與該類的開發人員提供的實現相同。

System.out.println(aBuilder.build().equals(aBuilder.build())); 

有關詳細信息,有噸關於這個問題,已經(例如Java == vs equals() confusion