2014-12-10 4 views
0

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

final class ImmutableClass 
{ 
    private final Date d; 

    public ImmutableClass(Date d) 
    { 
    this.d=d; 
    } 

    public Date getD() 
    { 
    return this.d; 
    } 

}

При использовании этого выше класс ниже в классе, как:

public class UserClass 
{ 
    public static void main(String args[]) 
    { 
    Date d1 = new Date(); 
    ImmutableClass im= new ImmutableClass(d1); 
    System.out.print("Date is : " + im.getD() + ", object is " + im);//printing originals 

    //trying to change the date 
    d1.setMonths("10"); 
    System.out.print("New Date is : " + im.getD() + ",New object is " + im);//printing latter ones 
    } 
} 

Результат выглядит следующим образом:

Date is : Wed Dec 10 10:38:43 IST 2014, object is [email protected] 

New Date is : Mon Feb 10 10:38:43 IST 2014,New object is [email protected] 

Объект даты в ImmutableClass изменяется и даже объект тот же, новый объект не создается.

Это противоречит определению неизменяемых классов. Просьба указать, ошибаюсь ли я в своем подходе или я пропустил что-то относительно концепции неизменности ??

С уважением!

ответ

0

У вызывающего абонента есть ссылка на Date (и может изменить их ссылку). Вы можете предотвратить это, если у вас есть clone() в конструкторе. Мол,

public ImmutableClass(Date d) 
{ 
    this.d = (Date) d.clone(); 
} 

Кроме того, абонент может изменить Date вы вернетесь в getD, так что вы должны клонировать() там же;

public Date getD() 
{ 
    return this.d != null ? (Date) this.d.clone() : null; 
} 

В качестве альтернативы, для Date, хранить количество миллисекунд он Обертывания как

final class ImmutableClass { 
    private final long d; 

    public ImmutableClass(Date d) { 
     this.d = (d != null) ? d.getTime() : 0; 
    } 

    public Date getD() { 
     return new Date(d); 
    } 
} 
+0

Это происходит только в случае Date объекта, в других случаях как String (класс), Int (примитивный) ... он возвращает исходные значения при вызове getXXX(), даже если мы изменим ссылочную переменную d .... почему поведение отличается? –

+0

@sukhparmar Это происходит из-за ссылок на объекты (и передача ссылок по значению по-прежнему проходит ссылку). Строка неизменна. Как и примитивные и оберточные типы. –

+1

теперь я получил его, класс coz Date изменен. Особое внимание должно быть уделено, возвращая его, как сказано, чтобы создать новый экземпляр. –

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