我有一个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: 我的朋友说第一个选项是别名,我不同意他的看法。他是对的吗?
答案 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类是否是不可变的。