2016-07-09 7 views
2

Существует сценарийПередача объекта в качестве параметра в Java

Скажет, у меня есть класс People & утилит класс PeopleUtil с методом computeTotalNumberOfPeople

В отдельном классе говорит EvaluatePeople, где у меня есть код

People people = new People(); 
people.setValue(10); 
people.setX(45); 
PeopleUtil.computeTotalNumberOfPeople(people); 
this.persistPeople(people); 

В методе computeTotalNumberOfPeople

public void computeTotalNumberOfPeople(People people){ 
    //logic for computing total no of people & then 
    int totalPeople = certainIntValue; 
    // I can return the totalPeople value from this method but I am not doing it just for the sake of this scenario 
    people.setTotalNumberOfPeople(totalPeople); 
} 

Когда я смотрю объект People в строке db, я вижу, что значение totalNumberOfPeople сохраняется. Это на самом деле прекрасно.

Мой вопрос в том, что я немного смущен, не должен computeTotalNumberOfPeople метод возвращает объект people, который имеет дополнительное заданное значение, к коду вызывающего метода &, тогда этот объект должен быть передан peristPeople методу as Аргумент?

Я надеюсь, вы понимаете, что я имею в виду, это не кажется правильным некоторым образом

+1

Вы передаете только объектные ссылки на вызовы метода. Таким образом, вы работаете на одном и том же объекте в каждом методе. Поэтому возврат обратно не нужен. – Codebender

+2

Вы * можете * изменить метод, чтобы вернуть объект 'people', который он дал, что может действительно субъективно сделать код более понятным в этом случае (в зависимости от личного мнения). Это не технически необходимо, потому что объект передается по ссылке, поэтому любые изменения, внесенные в объект, на который ссылается эта переменная, будут отражаться в любой другой переменной, которая ссылается на тот же экземпляр объекта. – David

+1

Как общий комментарий, я считаю, что сеттеры плохо работают. Вы хотите, чтобы ваши классы были как можно более неизменными, в противном случае отслеживание состояния может быть сложным. – Dici

ответ

2

Объекты изменчивы - они могут быть изменены.

Так что, когда вы звоните people.setTotalNumberOfPeople(totalPeople), вы устанавливаете переменную totalNumberOfPeople (или как там оно называется внутри People класса) в totalPeople для people объекта.

Когда вы выходите из метода computeTotalNumberOfPeople, объект по-прежнему остается тем же, который был изменен - ​​изменения из метода сохраняются.

Один из способов подумать об этом передает ссылку people. Когда вы звоните computeTotalNumberOfPeople(people), вы принимаете ссылку на номер people. Когда изменяется people, вы изменяете одно и то же местоположение в памяти, и поэтому изменения сохраняются.

+0

Методы побочных эффектов не особенно идиоматичны в Java. Я бы просто возвращал общее количество людей и позволял вызывающему решить, что с ним делать. Это более гибкий, более идиоматический и более четкое разделение проблем – Dici