Отличаются ли геттеры объектов от примитивов? - PullRequest
2 голосов
/ 01 января 2012

Если получатели просто возвращают объект:

public MyObject getMyObject() {
    return myObject;
}

Или он должен сделать копию возвращаемого объекта и вернуть копию?

public MyObject getMyObject() {
    MyObject tempObject;
    // call setters to set its attributes
    return tempObject;
}

Курсы средней школы "CS" здесь недостаточно подробны. Мой учитель никогда не говорил о классах, предметах и ​​ссылках.

Ответы [ 2 ]

4 голосов
/ 01 января 2012

Это зависит от того, что вы пытаетесь сделать.

В общем, вы просто хотите ссылку на объект и используете свой первый пример кода. Например, компоненты Swing имеют метод с именем getTopLevelAncestor(). Совершенно бесполезно иметь копию родительского компонента - нужна ссылка на фактического родителя ребенка.

Возврат копии не является стандартным и должен использоваться только при очень определенных (и хорошо документированных) обстоятельствах. Другие люди, использующие ваш код, не ожидают получить копии объектов.

3 голосов
/ 01 января 2012

Единственное отличие состоит в том, что хотя возвращаемые примитивы являются "неизменяемыми" по своей природе, возврат объекта, подобного этому, может позволить вызывающей стороне изменить свойства объекта (при условии, что MyObject является изменяемым), что может повлиять на внутренние компоненты вашего класса. реализация. (Инструменты анализа кода, такие как FindBugs, проверяют именно это. Примитивы на самом деле изменчивы, но когда они возвращаются из класса, нет способа обновить значение класса с помощью возвращаемого примитива.) С учетом этого обычно безопаснее сделать ставку на возврат копии / clone - понимание того, что при этом может возникнуть потеря производительности.

Какой бы вариант вы ни выбрали, пожалуйста, задокументируйте, что ваш класс или отдельные методы делают с помощью Javadoc.

...