System.identityHashCode равно на экземплярах String - PullRequest
0 голосов
/ 05 сентября 2018

из-за причин, по которым я пытаюсь скопировать / клонировать экземпляры объектов. И в случае с String я попробовал что-то вроде этого:

У меня есть такой объект, как

class Foo{
    private String test;
    //Getters && Setters are generated
}

и метод копирования, например:

private static Object copyMemberData(Object originalMemberData) {
    if (originalMemberData == null) {
        return null;
    }

    ...
    if (originalMemberData instanceof String) {
        return String.valueOf(originalMemberData);
    } 
    ...
}

который используется как

PropertyDescriptor propDesc = new PropertyDescriptor("test", Foo.class);
//Get Data from original object
final Object originalMemberData = propDesc.getReadMethod().invoke(originalFoo);
final Object copiedMemberData = copyMemberData(originalMemberData);

А потом я попытался сравнить результат с System.identityHashCode, чтобы убедиться, что я не работаю над ссылкой.

if (System.identityHashCode(copiedMemberData) == System.identityHashCode(originalMemberData)) {
     throw new RuntimeException("Cloning is buggy!");
}

И я удивлен, что это действительно совпадает и выдает мне ошибку. Может быть, кто-то может объяснить мне причину этого.

1 Ответ

0 голосов
/ 05 сентября 2018

Я узнал :-)

Строка такая же, даже если я сравниваю ее с == вместо equals. Это так, потому что метод toString() класса String.java, который используется в String.valueOf(Object obj), реализован следующим образом:

public String toString() {
    return this;
}

Для успешного копирования строки используйте:

return new String(((String)originalMemberData).toCharArray());
...