2015-12-09 2 views
4

Я узнаю о неизменяемых объектов. Я должен сделать следующий класс неизменным. Я сделал это правильно?Создание класса Неизменяемый

import java.awt.Point; 
public class MyImmutablePoint { 
    Point point; 

    public MyImmutablePoint(Point point) { 
     super(); 
     this.point = point; 
    } 

    public MyImmutablePoint() { 
     this (new Point (0,0)); 
    } 

    public Point getPoint() { 
     return point; 
    } 

    public void setPoint(Point point) { 
     this.point = point 
    } 
} 

"Неизменное" Класс:

public final class MyImmutablePoint { 
    private final Point point; 

    public MyImmutablePoint(Point point) { 
     this.point = point; 
    } 

    public MyImmutablePoint() { 
     this (new Point (0,0)); 
    } 

    public Point getPoint() { 
     return point; 
    } 
} 

Iam не уверен в toString методе, хотя. и, возможно, возвращение объекта, например Точка, может быть изменена так же, как массив, но не уверен

+2

** Отформатируйте свой код **. Это неразборчиво. –

+0

Вопрос: спросите себя: «* возможно ли изменить внутреннее состояние моего объекта после его создания? *". Если ответ * да *, то ваш объект не является неизменным. Помните, что внутреннее состояние вашего объекта является продуктом внутренних состояний всех ваших полей-членов, поэтому, если * any * ваших полей-членов изменен, ваш объект должен обращаться с доступом к этому полю очень осторожно, иначе ваш объект будет изменяться , – JonK

+0

@OP - если ответ решил вашу проблему, рассмотрите [его принятие] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). Это сигнализирует остальной части сообщества, что вопрос был решен. –

ответ

6

Нет

final Point p = new Point(0,0); 
final ImmutablePoint ip = new ImmutablePoint(p); 

Два примера:

//change the original Point passed in 
p.x = 10 
//use the getter and change the Point 
ip.getPoint().x = 10 

Итак, сначала нужно создать защитную копию о Point принятых в конструкторе:

public MyImmutablePoint(Point point) { 
    this.point = new Point(point); 
} 

Затем вам нужно создать защитную копию Point возвращенную из добытчика:

public Point getPoint() { 
    return new Point(point); 
} 

Все это приводит меня предположить, что это, вероятно, будет лучше не подвергать внутренний point вообще:

public final class MyImmutablePoint { 

    private final Point point; 

    public MyImmutablePoint(Point point) { 
     this.point = new Point(point); 
    } 

    public MyImmutablePoint() { 
     this.point = new Point (0,0); 
    } 

    public int getX() { 
     return point.x; 
    } 

    public int getY() { 
     return point.y; 
    } 
} 

Далее введите ваш код и заказать ваши члены.

+0

Должен ли я вернуть копию Точки? Ой, я думаю, я не могу дать ссылку на точку, но я shud дать int x, int y , так что его либо MyImmutablePoint(), либо MyImmutablePoint (x, y) –

+0

Хорошо, спасибо, я вижу это сейчас. Я предполагаю, что определение неизменяемого объекта заключается в том, что его поток также безопасен. Так что я скорее синхронизирую мой метод toString –

+0

@TimoN. Я не понимаю ваш комментарий.Неизменяемость и нити являются только касательными. Мое определение неизменяемого объекта состоит в том, что оно ** непреложное **. См. [Wikipedia] (https://en.wikipedia.org/wiki/Immutable_object) для получения дополнительной информации. –

5

Нет, это не является неизменным. Точка все еще может быть изменена создателем MyImmutablePoint. Пример:

Point point = new Point(1, 1); 
    MyImmutablePoint immutablePoint = new MyImmutablePoint(point); 
    point.setLocation(0, 0); 
+0

Должен ли я вернуть копию Точки? о, я думаю, я не могу дать ссылку на точку, но я shud дать int x, int y, так что его либо MyImmutablePoint(), либо MyImmutablePoint (x, y) –

+0

Я бы использовал MyImmutablePoint (int x, int y) в качестве конструктора и я думаю, что я создам новый Точка, основанный на тех, кто возвращается. Неправильная практика имеет гораздо больше, чем возвращаемую строку в методе get-method, но во избежание изменчивости я бы, вероятно, сделал это. Я бы не сделал копию. –

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