2015-01-13 3 views
0

У меня есть класс цвета rgb и класс луковицы. мой вопрос, что это правильный способ вернуть GetColor в термометру класса света: первый вариант:getter возврат нового экземпляра или копия

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: мой друг сказал, что первый вариант - сглаживание, я не согласен с ним. он прав?

+2

Что такое класс RGBColor? Можете ли вы обеспечить реализацию? –

+0

Мы не знаем, что такое «RGBColor», поэтому мы не можем ответить. Если вы скажете 'return _color', вы вернете ссылку на тот же объект, к которому относится ваша личная переменная.Если ваш класс позже изменит значение 'RGBColor' (если он не является неизменным), возвращаемое значение также укажет на измененный объект. Но если вы вернете «новый RGBColor (_color)», возвращаемое значение будет ссылкой на другой объект, поэтому, если вы его измените, другое не будет изменено. Какой правильный? Недостаточно информации, чтобы рассказать. – ajb

+0

добавлена ​​реализация для RGBColor – AlexTheLion

ответ

1

Я думаю, что первый вариант - лучший способ. Вы создаете новый цветовой объект для каждого объекта LightBulb, поэтому вместо того, чтобы снова создавать ненужные цветовые объекты в методе getColor, что может привести к проблемам с памятью, лучше вернуть экземпляр, созданный для цвета в конструкторе.

Поскольку мы не знаем, является ли класс RGBColor неизменным или нет.

+0

мой RGBColor может быть обновлен, поэтому он не является неизменным, я могу обновить его сеттерами – AlexTheLion

+0

, мой друг сказал, что первый вариант - сглаживание, я не согласен с ним. он прав? – AlexTheLion

+0

Как видно из вашего кода, что класс изменен, я бы ответил своим ответом, что вместо создания новых объектов каждый раз в getColor, который может быть вызван несколько раз, что вызывает проблемы с памятью, лучше использовать вариант один. –

3

Если класс RGBColor является неизменным (то есть экземпляр RGBColor не может быть изменен после создания) Я предлагаю вам просто вернуть его.

Однако, если можно изменить значение объекта типа RGBColor это возможно, что при возврате объекта непосредственно вы подвергать много информации к абоненту и поведению LightBulb не может быть определенно. В таком случае я (возможно) верну копию.

Но, ИМО лучший подход здесь состоит в том, чтобы сделать класснеизменным.

Пример:

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; 
    } 
} 

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

+0

моя RGBColor может быть обновлена, так что она не является неизменной – AlexTheLion

+0

они не являются окончательными – AlexTheLion

+0

является опцией одного наложения псевдонимов? – AlexTheLion

4

Это действительно зависит от того, что вы хотите. Оба варианта являются законными для разных случаев.

Вы хотите, чтобы клиент, вызывающий геттер, мог изменить объект по ссылке, таким образом, чтобы объект, содержащийся внутри LightBulb, был изменен? Используйте вариант один.

Вы не хотите, чтобы вызывающий абонент мог это сделать? Используйте вариант два.

Вы хотите, чтобы объект RGBColor не мог изменить, даже изнутри LightBulb? Сделайте RGBColor неизменным.

Смежные вопросы