getter返回新实例或副本

时间:2015-01-13 07:31:11

标签: java

我有一个rgb颜色类和一个灯泡光类。 我的问题是在灯泡灯类中返回getColor的正确方法是什么: 第一个选择:

public RGBColor getColor()
{
    return _color;
}

第二个选项:

public RGBColor getColor()
{
    return new RGBColor(_color);
}

BulbLight类:

private RGBColor _color;
public LightBulb (int red, int green, int blue )
{
    _color = new RGBColor(red,green,blue);

}

RGBColor类:

public class RGBColor {
    private int _red;
    private int _green;
    private int _blue;

    public RGBColor()
    {
        _red = 0;
        _green = 0;
        _blue = 0;
    }

    public RGBColor(RGBColor other)
    {
        _red = other._red;
        _green = other._green;
        _blue = other._blue;
    }
//... getterg and setters for red,green,blue
}

更新了qeustion: 我的朋友说第一个选项是别名,我不同意他的看法。他是对的吗?

3 个答案:

答案 0 :(得分:4)

这实际上取决于你想要什么。这两种选择对于不同的情况都是合法的。

您是否希望调用getter的客户端能够通过引用更改对象,以便更改LightBulb内的对象?使用选项一。

你不希望呼叫者能够这样做吗?使用选项二。

您是否希望RGBColor对象永远无法更改,即使是在LightBulb内也是如此?使RGBColor不可变。

答案 1 :(得分:3)

如果类RGBColor是不可变的(即创建后RGBColor的实例无法更改),我建议您只返回它。

但是,如果可以更改RGBColor类型的对象的值,则可能通过直接返回对象,向调用者公开了大量信息以及LightBulb的行为。无法确定。在那种情况下,我会(可能)返回一份副本。

但是,IMO这里最好的方法是使RGBColor类不可变。

示例:

public class RGBColor {
    private final int blue;
    private final int green;
    private final int red;

    public RGBColor(final int red, final int green, final int blue) {
        this.red = red;
        this.green = green;
        this.blue = blue;
    }

    public int getBlue() {
        return blue;
    }

    public int getGreen() {
        return green;
    }

    public int getRed() {
        return red;
    }
}

编辑:来自OP的更多输入。 由于您的RGBColor实施包含" setter"我建议你回复一份。但是,根据我的更好的方法是使类不可变,如在提供的示例中。

答案 2 :(得分:1)

我认为第一种选择是更好的方法。您正在为每个LightBulb对象创建一个新的颜色对象,因此不要在getColor方法中再次创建不必要的颜色对象,这可能导致内存问题,最好在构造函数中返回为颜色创建的实例。

因为我们不知道RGBColor类是否是不可变的。