Проблема с передачей по ссылке в Spring - PullRequest
1 голос
/ 07 августа 2011
public class Apple
{
    private boolean isJuicy;
    private boolean isRipe;

    public Apple(boolean isJuicy)
    {
        isJuicy = isJuicy;
    }

    public void setRipe(boolean ripe)
    {
        this.isRipe = ripe;
    }

    public boolean isRipe()
    {
        return this.isRipe;
    }

}

Весной у меня есть два класса обслуживания AppleService & FruitService.

AppleService

public Apple createApple(boolean isJuicy)
{
    Apple apple = null;
    apple = new Apple(isJuicy);
    fruitService.saveApple(apple);

    log("ripe:" + apple.isRipe()); // false

    return apple;
}

FruitService

public void saveApple(Apple apple)
{
    if(apple.isJuicy())
        apple.setRipe(true);

    persist(apple);

    log("ripe:" + apple.isRipe()); // true

}

ПочемуApple сообщила, что она созрела в FruitService, но не в AppleService?

Я думал, что тот факт, что он передается по ссылке на FruitService, гарантирует, что должны присутствовать одинаковые свойства объекта и объектав apple объекте в AppleService?

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Я думаю, что проблема заключается в следующем: вы не устанавливаете isRipe в true в конструкторе, когда isJuicy передается как true.В Java значение по умолчанию для неустановленного логического значения - false.Это исправит это:

private boolean isRipe;

public Apple(boolean isJuicy) {
    this.isJuicy = isJuicy; // Note: added "this.", otherwise your assignment just sets the parameter to itself
    isRipe = isJuicy; // Set isRipe too
}
0 голосов
/ 07 августа 2011

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

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

Это лучше объяснено здесь . Вы также можете посмотреть этот вопрос StackOverflow.

...