2013-04-24 2 views
-1

Не уверен, что здесь происходит, я пытаюсь сделать что-то очень простое, установить объект по ссылке. Я написал тот же код дважды, после установки объекта по ссылке, после возвращения нового объекта и установки его там. Вот кодСсылка на справочные данные Java не работает

for (Person p : test) { 
    bcPetDao.refreshRef(p.pet); 
    Log.e("Woo1", "Name:" + p.pet); 
    Log.e("Woo1", "Addess: " + p.pet.hashCode()); 
} 
for (Person p : test) { 
    p.pet = bcPetDao.refresh(p.pet); 
} 
Log.e("Woo2", "Name:" + test.get(0).pet); 

И код для обновления и refreshRef является:

public T refresh(T object) { 
    try { 
     String id = cachedClass.idEntry.getKey().get(object).toString(); 
     return queryOne(new Query(cachedClass.idColName + " = ?", new String[] { id }, null, null, null, null)); 
    } catch (IllegalArgumentException e) { 
     throw new RuntimeException(e); 
    } catch (IllegalAccessException e) { 
     throw new RuntimeException(e); 
    } 
} 

public void refreshRef(T object) { 
    try { 
     String id = cachedClass.idEntry.getKey().get(object).toString(); 
     object = queryOne(new Query(cachedClass.idColName + " = ?", new String[] { id }, null, null, null, null)); 
     BcLog.e("In Ref name is: " + object.toString()); 
     BcLog.e("Addess: " + object.hashCode()); 
    } catch (IllegalArgumentException e) { 
     throw new RuntimeException(e); 
    } catch (IllegalAccessException e) { 
     throw new RuntimeException(e); 
    } 
} 

Есть ли что-то с Java генериков, что делает это не просто работа? Вот распечатка журнала.

04-23 22:50:55.643: E/BcLog(30237): In Ref name is: ID: 119, name: 3fdb2a3ab1c0a2e8 
04-23 22:50:55.643: E/BcLog(30237): Addess: 1090746752 
04-23 22:50:55.643: E/Woo1(30237): Name:ID: 119, name: null 
04-23 22:50:55.643: E/Woo1(30237): Addess: 1087524160 
04-23 22:50:55.663: E/BcLog(30237): In Ref name is: ID: 118, name: 3fccb118500e0f1c 
04-23 22:50:55.663: E/BcLog(30237): Addess: 1088206960 
04-23 22:50:55.663: E/Woo1(30237): Name:ID: 118, name: null 
04-23 22:50:55.663: E/Woo1(30237): Addess: 1087682616 
04-23 22:50:55.684: E/BcLog(30237): In Ref name is: ID: 117, name: 3fe026bb4d24bfe2 
04-23 22:50:55.684: E/BcLog(30237): Addess: 1088359352 
04-23 22:50:55.684: E/Woo1(30237): Name:ID: 117, name: null 
04-23 22:50:55.684: E/Woo1(30237): Addess: 1090724368 
04-23 22:50:55.714: E/BcLog(30237): In Ref name is: ID: 116, name: 3fe26d6a3967d838 
04-23 22:50:55.714: E/BcLog(30237): Addess: 1090659992 
04-23 22:50:55.714: E/Woo1(30237): Name:ID: 116, name: null 
04-23 22:50:55.714: E/Woo1(30237): Addess: 1088417312 
04-23 22:50:55.734: E/BcLog(30237): In Ref name is: ID: 115, name: 3fef8ec496c0cdb2 
04-23 22:50:55.734: E/BcLog(30237): Addess: 1088221128 
04-23 22:50:55.744: E/Woo1(30237): Name:ID: 115, name: null 
04-23 22:50:55.744: E/Woo1(30237): Addess: 1088572064 
04-23 22:50:55.824: E/Woo2(30237): Name:ID: 119, name: 3fdb2a3ab1c0a2e8 
+0

Что вы хотите сделать? – Zyerah

+0

Обновите p.pet, чтобы иметь самые новые значения из моей базы данных. Он не работает после 1-го foreach (по ссылке), но делает после 2-го для каждого (возвращает новый объект). – bclymer

ответ

2

Java является передачей по значению. При вызове refreshRef(object), метод будет иметь локальную копию справки объекта (считают это указатель), так назначая эту ссылку в теле метода не будет влиять на объект, который вы прошли в.

Как там это только одна копия объекта в памяти, вы можете изменить членов объекта, на который вы ссылаетесь, но вы не можете изменить сам экземпляр.

+0

Нет, не будет. Хотя Java является передачей по значению, передаваемое абсолютное значение является указателем на объект. В памяти существует только одна копия объекта. – Zyerah

+0

Да, это определенно имеет смысл. Теперь я чувствую себя глупо, спасибо. У меня создалось впечатление, что это реальный пропуск по значению, потому что свойства будут меняться, но вы правы, обновление самой ссылки не будет работать. – bclymer

+0

@Telthien, я не сказал, что он передает копию объекта, но копию (значение) ссылки на объект. Поэтому, если в методе изменена копия ('T object'), это изменение не распространяется на вызывающий код. Однако, если члены объекта будут изменены, это изменение будет распространяться, поскольку объект существует только один раз. – 323go

Смежные вопросы