2011-08-07 121 views
1
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; 
    } 

} 

在Spring通过按引用我有两个服务类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 

} 

为什么苹果报告为FruitService但不是在AppleService是成熟?

我认为通过引用FruitService传递的事实可以保证AppleService中的apple对象中应该存在相同的对象和对象属性?

+2

让我们从Java *不使用传递引用开始。它为* everything *使用传值,但这些值是基元或引用。我认为这与这个问题没有关系,但是用术语来说是值得的。 –

+2

我很难看到您所举报的行为是如何可能的 - 或者如何在Spring参与,除非你正在使用某种形式的拦截这是克隆的投入。我建议你编辑你的代码,直到你有一个简短的*完整的例子来证明这个问题。我怀疑,想出这样一个例子,你会找出问题所在。特别是,我将从删除持久性部分开始。 –

+0

你把它设置成水果服务。你永远不会在苹果服务中设置它,你只能设置它。与春天无关。 – Kevin

回答

0

尽管我同意关于这个问题的意见(你需要发布更多的代码),但我确定这里的核心问题是,Java是从来没有 pass-by-reference。它为原始值传递原始值,并为对象传递“对象引用”(基本上是指针)。

在Java中,当你作为参数传递的对象,调用对象的方法会影响传递的原始对象。但实际上将值分配给该对象不会影响传递的对象,而不是你设定的基准(又名指针)到一个新的对象。

这是更好地解释here。你可能也想看看this StackOverflow的问题。

1

我认为这个问题是这样的:当isJuicy作为真正的传递你是不是在构造函数中设置isRipe为true。在java中,未设置布尔值的默认值为false。 这将解决这个问题:

私人布尔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 
}