セットには、そのメンバーの1に等しい項目が含まれていませんか?

User1291:

そうするJava APISet::contains

が真とこのセットは、このような要素eが含まれている場合にのみ(O == nullの電子== nullの?:o.equals(e)参照)

だから... ...なぜそれがセットに等しいです正確に一つの要素が含まれている場合でも、このメソッドが返すの偽のcreds

private boolean validate(Credentials creds){
    Set<Credentials> acceptedUsers = getAcceptedUsers();
    return acceptedUsers.contains(creds);
}

具体的には、私はいくつかを挿入しました printlns

private boolean validate(Credentials creds){
    Set<Credentials> acceptedUsers = getAcceptedUsers();

    System.out.print("accepted users: ");
    System.out.println(acceptedUsers);
    System.out.print("accessing user: ");
    System.out.println(creds);
    System.out.println("items are equal: " + acceptedUsers.stream().map(c -> c.equals(creds)).collect(Collectors.toSet()));
    System.out.println("access ok: " + (acceptedUsers.contains(creds) ? "YES" : "NO"));

    return acceptedUsers.contains(creds);
}

そしてこれは言っていたものです:

accepted users: [[
    foo
    FCDE2B2EDBA56BF408601FB721FE9B5C338D10EE429EA04FAE5511B68FBF8FB9
]]
accessing user: [
    foo
    FCDE2B2EDBA56BF408601FB721FE9B5C338D10EE429EA04FAE5511B68FBF8FB9
]
items are equal: [true]
access ok: NO

getAcceptedUsers 現在、ダミーのセットを返します。

private Set<Credentials> getAcceptedUsers(){
    return new HashSet<Credentials>(){{add(new Credentials("foo","bar", false));}};
}

そして、Credentialsとして実装されています

class Credentials{
    final String username;
    final String password;

    public Credentials(String username, String password, boolean isPasswordHashed) {
        this.username = username;

        if(isPasswordHashed) this.password = password;
        else {
            MessageDigest md;
            try {
                md = MessageDigest.getInstance("SHA-256");
            } catch (NoSuchAlgorithmException e) {
                throw new IllegalStateException(e);
            }

            md.update(password.getBytes());
            byte[] hash = md.digest();

            this.password = (new HexBinaryAdapter()).marshal(hash);
        }
    }

    @Override
    public boolean equals(Object obj) {
        if(obj == null) return false;
        if(!(obj instanceof Credentials)) return false;
        Credentials other = (Credentials)obj;
        return this.username.equals(other.username) && this.password.equals(other.password);
    }

    @Override
    public String toString() {
        return String.format("[\n\t%s\n\t%s\n]", username,password);
    }
}
ビースクウエアℬℬ:

実装equals方法は十分ではありません、あなたが実装する必要がありhashCodeすぎ。

あなたが読むことができると同様に、ここで

このセットのハッシュコード値を返します。セットのハッシュコードは、ヌル要素のハッシュコードがゼロになるように定義されているセット内の要素のハッシュコードの合計であると定義されます。Object.hashCodeの一般規約によって要求される任意の二つのセットs1とs2のためs1.equalsは(S2)を意味することを本確実s1.hashCode()== s2.hashCode()()。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=184016&siteId=1