Eclipse - почему генерировать геттеры и сеттеры не учитывает «по ссылке» - PullRequest
0 голосов
/ 02 декабря 2011

если java всегда передает переменные по ссылке, почему eclipse генерирует bean без какого-либо рассмотрения.

вместо: return myStr;

должно быть return new String(myStr);

нет?

Редактировать
Хорошо, мой пример был плохим.
позволяет оставить затмение, когда я хочу вернуть пользовательский объект.Нужно ли мне создавать «конструктор копирования» и возвращать его так:

return new MyCustomObject(myCustomObject);


class MyCustomObject{

  private String str; 
  public MyCustomObject(String str){
    this.str = str;
  }

  public MyCustomObject(MyCustomObject obj){
    this.str =  obj.str;    
  }
}

Должен ли я это написать?

Ответы [ 3 ]

5 голосов
/ 02 декабря 2011

номер

В Java каждая переменная объекта является ссылкой. Объекты не могут быть переданы по значению, только примитивы могут (и всегда). Ну, это немного вводит в заблуждение. ссылка передается по значению, но вы можете думать, что все является ссылкой, но не в смысле C ++.

Возможно, проще всего использовать пример.

SomeObject foo;

public void doSomething(SomeObject bar) {
    bar.whatever();
    bar = new SomeObject();
    bar.someOtherMethod();
}

public void doStuff() {
    foo = new SomeObject();
    doSomething(foo);
}

Итак, foo является ссылкой на экземпляр SomeObject. Когда вызывается doSomething, значение этой ссылки копируется в bar, поэтому теперь foo и bar являются ссылками на один и тот же SomeObject.

Строка bar.whatever() вызывает whatever для того же объекта, к которому относится foo.

bar = new SomeObject() означает, что foo и bar теперь относятся к различным SomeObject экземплярам, ​​поэтому someOtherMethod это не , вызываемый для объекта, foo относится к.

Это полностью отличается от C ++, где

void doSomething(SomeObject& bar) {
    bar = whatever;
}

имеет совершенно другое значение. Вы действительно никогда не должны думать о Java в терминах C ++.

Что касается вашего примера, String s являются неизменяемыми в Java, поэтому не имеет значения, даже если объекты могут быть переданы по значению.

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

Например:

class ClassWithInternalList {
    private List<String> reallyImportantData;

    public List<String> getImmutableViewOfData() {
        // Take advantage of the java.util.Collections tool for making a List immutable.
        return Collections.unmodifiableList(reallyImportantData);
    }

    public List<String> getSafeCopyOfData() {
        // Return a copy that the caller can modify without changing reallyImportantData.
        return new ArrayList<String>(reallyImportantData);
    }

    public List<String> justGetTheData() {
        // Return a reference to reallyImportantData that the caller can modify at will.
        return reallyImportantData;
    }
}

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

java.util.Collections позволяет легко получить неизменяемое представление Collection, но для пользовательских классов вам нужно сделать свою собственную неизменяемость.

Помните, что вам нужно делать это только в случае проблемы с изменчивостью. Ваш пример MyCustomObject по-прежнему неизменен (поскольку вызывающий не может изменить состояние в возвращенном экземпляре MyCustomObject), поэтому вопрос по-прежнему спорный.

0 голосов
/ 02 декабря 2011

Обычно вы не хотите создавать новый объект при использовании геттера. Обычно вам нужно, чтобы ссылка на атрибут объекта работала с ним проще, для инкапсуляции и имела правильное значение, даже если что-то еще изменяет значение атрибута перед его использованием.

Создание нового экземпляра объекта методом, который часто вызывается, не ожидается, что он это сделает, и даже не объявляет о том, что делает это, чертовски anti-pattern .

0 голосов
/ 02 декабря 2011

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

Другое условие, переменная является пользовательским типом, возможно, ваш класс определяет конструктор с собой, например String,возможно, нет .Так что eclipse не знает, как сгенерировать свою копию.

Как всем известно, ссылка на передачу Java, так что программисты Java используют ее для возврата ссылки и позволяют другим модифицировать.* Если вам это не нравится, вы можете вернуть копию или реализовать Immutable.

...