Нет ли в Java абсолютно никакого способа передать сам объект в метод, чтобы он действительно изменился? - PullRequest
0 голосов
/ 01 сентября 2009
class MetaData {
    public String version;
    public String compression;
}

Я создаю объект MetaData, передаю его в метод и заполняю поля версии и сжатия внутри метода. И я хочу, чтобы эти изменения существовали вне времени существования метода. В C ++ я думаю, что добавил & или что-то, чтобы передать сам объект, а не его копию методу. Есть ли способ сделать то же самое в Java?

Ответы [ 4 ]

17 голосов
/ 01 сентября 2009

Это всегда будет происходить в Java. Просто так работает Java. Когда вы передаете объект «MetaData» методу, передается ссылка на этот объект, и любые изменения, сделанные в его полях «версия» и «сжатие», должны быть видны везде.

Проверьте эту статью для действительно глубокого объяснения:

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

5 голосов
/ 01 сентября 2009

Java имеет семантику передачи по значению . Это не означает, что объекты передаются по значению в методы. Скорее это означает, что ссылки на объекты передаются по значению методам.

Таким образом, в этом сценарии, когда вы создаете объект MetaData и передаете его методу, в котором поля заполнены, ссылка на объект передается этому методу. Когда метод вернется, вы можете проверить ссылку на объект в вызывающей стороне, чтобы убедиться, что его поля были установлены.

Кстати, это плохая практика в ООП, если вы отправляете объект MetaData другому классу для установки состояния объекта. Сами объекты должны отвечать за свое состояние.

4 голосов
/ 01 сентября 2009

Это поведение по умолчанию в Java.

class Example {
   public static void doit(MetaData data) {
     data.compression = "Testing"
   }

   public static void main(String[] args) {
     MetaData data = new MetaData();
     doit(data);
     System.out.println(data.compression);
   }
}
1 голос
/ 01 сентября 2009

Все изменяемые объекты, которые вы передаете методам, могут быть изменены, а оригинал изменится. Проблема в том, что строку нельзя изменить - она ​​неизменна.

Передайте объект, который можно изменить.

Если вы хотите изменить «версию», тогда передайте вашему классу «MetaData» метод .setVersion () и передайте «MetaData» вашему методу. Ваш метод будет вызывать metaData.setVersion ("I'm NEW"); и все будут счастливы.

public void willWorkFine (Metadata metaData) {
    metaData.setVersion("Changed!");
}

Что вы не можете сделать, это передать "версию" методу, ожидающему строку, и переназначить его:

public void wontWork(String changeMe) {
    changeMe="not changed!";
}

Поскольку changeMe - это просто локальная ссылка на исходный объект «версия», переназначение вашей локальной ссылки для указания на другой объект не влияет на внешнюю программу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...