2016-12-18 2 views
-2

Я должен решить, являются ли следующие два объекта неизменяемыми. Я искал определение, в котором говорится: «Объект считается неизменным, если его состояние не может измениться после его построения».Являются ли объекты неизменяемыми?

public class Car { 
    private int spareTires = 1; 
    private String model = "Volkswagen"; 
    private Person driver = new Person(); 
    public double engineSize = 2.0; 
    public int getSpareTires() { return spareTires; } 
    public String getModel() { return model; } 
    public Person getDriver() { return driver; } 
} 

public class Person { 
    private String name = "James"; 
    public void setName(String s) { name = s; } 
    public String getName() { return name; } 
} 

Person не является неизменным, поскольку он имеет метод мутатор (setName()).

Однако я не уверен насчет Car. Car не имеет методов мутаторов, но согласно https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html поля должны быть объявлены окончательными и статическими, что не так. Также я считаю, что можно изменить состояние через public double engineSize = 2.0;?

+1

Вы можете мутировать общедоступные поля экземпляра, да –

+0

И вам нужно только установить окончательное значение как неизменяемое, а не статическое –

+0

Вопросы и ответы на Stack Exchange следуют стандартным синтаксисом форума-сообщения. HTML не нужно. – Gendarme

ответ

0

Однако я не уверен относительно автомобиля. У автомобиля нет методов мутаторов , но в соответствии с https://docs.oracle.com/javase/tutorial/essential/concurrency/imstrat.html поля должны быть объявлены окончательными и статическими, что не так.

Не обязательно статический, окончательный достаточно.

Также я считаю, что можно изменить состояние через «public double engineSize = 2.0; "?

Действительно, чтобы быть неизменным, вам не нужно публиковать поля, описывающие состояние экземпляра. В противном случае любой клиентский класс экземпляра может изменить engineSize.

Кроме того, этот геттер в Car классе делает лицо изменяемого так Person не является неизменным:

public Person getDriver() { return driver; } 
+1

Поля не обязательно должны быть 'final' для неизменного объекта. – Andreas

+0

Не совсем верно, но объявление их как окончательного является хорошей практикой, поскольку оно ограничивает модификацию полей, запрещая, по крайней мере, любые новые назначения. Я в основном ответил, что OP прочитал в предоставленной ссылке, и в этом контексте модификатор 'final' достаточно, но модификатор' static' не требуется. @ Andreas – davidxxx

+0

Правда. «Статическая» часть, вероятно, всего лишь «опечатка» OP, поскольку связанная статья гласит 'private', а не' static'. – Andreas

0

Car не является неизменным, так как он имеет driver свойство, которое изменчиво и предоставляет общественность engineSize метода, который изменчивый. Также ни один из обоих классов не является окончательным.