2015-07-04 2 views
4

У меня есть следующий абстрактный класс:Java Создание непреложных подклассов

public abstract class Client { 

     final private String anonymousCilentID; 
     final private String anonymousCilentFirstName; 
     final private String anonymousCilentLastName; 
     final private String gender; 

      protected Client(String anonymousCilentID, String anonymousCilentFirstName, String anonymousCilentLastName, String gender) { 
       this.anonymousCilentID = anonymousCilentID; 
       this.anonymousCilentFirstName = anonymousCilentFirstName; 
       this.anonymousCilentLastName = anonymousCilentLastName; 
       this.gender = gender; 
      } 

     public String getAnonymousCilentID() { 
      return anonymousCilentID; 
     } 

     public String getAnonymousCilentFirstName() { 
      return anonymousCilentFirstName; 
     } 

     public String getAnonymousCilentLastName() { 
      return anonymousCilentLastName; 
     } 

     public String getGender() { 
      return gender; 
     } 
    } 

и следующий Подкласс:

final public class AnonymousCilent extends Client { 


    final private Date arrivalDate; 
    final private String immStatus; 
    final private Date registrationDate; 
    final private String registrationSite; 
    final private String siteName; 
    final private String comments; 



final public class AnonymousCilent extends Client { 


    final private Date arrivalDate; 
    final private String immStatus; 
    final private Date registrationDate; 
    final private String registrationSite; 
    final private String siteName; 
    final private String comments; 

    public AnonymousCilent(String anonymousCilentID, String anonymousCilentFirstName, String anonymousCilentLastName, String gender, Date arrivalDate, String immStatus, Date registrationDate, String registrationSite, String siteName, String comments) { 

     super(anonymousCilentID,anonymousCilentFirstName, anonymousCilentLastName, gender); 

     this.arrivalDate = arrivalDate; 
     this.immStatus = immStatus; 
     this.registrationDate = registrationDate; 
     this.registrationSite = registrationSite; 
     this.siteName = siteName; 
     this.comments = comments; 
    } 


    public Date getArrivalDate() { 

     return new Date (arrivalDate.getTime()); 
    } 

    public String getImmStatus() { 
     return immStatus; 
    } 

    public Date getRegistrationDate() { 
     return new Date (registrationDate.getTime()); 
    } 

    public String getRegistrationSite() { 
     return registrationSite; 
    } 

    public String getSiteName() { 
     return siteName; 
    } 

    public String getComments() { 
     return comments; 
    } 
} 

Мне нужно создать подкласс, но я хочу делать то, что является лучшей практикой, когда он приходит к созданию непреложных классов. Я назначил свой абстрактный конструктор защищенным, объявил мои переменные private final/no setters. Является ли мой подкласс неизменным? Я что-то сделал в плохой практике? Если да, то как это исправить?

+0

Ваш подкласс эффективно изменчиво, потому что он выставляет 'date', которое изменчиво ... –

+0

AH! Мне нужно защитное копирование правильно? Кроме этого, вы видите другие проблемы? –

ответ

4

Ваш класс AnonymousCilent не является неизменным, потому что класс java.util.Date не является неизменным. Я мог бы сделать это:

AnonymousCilent object = ...; 

// Modifies the Date object held by the AnonymousCilent object 
object.getArrivalDate().setDate(23); 

Чтобы предотвратить это, добытчики для объектов дата должна возвращать копии переменных-членов, например:

public Date getArrivalDate() { 
    // Return a copy of member variable arrivalDate 
    return new Date(arrivalDate.getTime()); 
} 

Но было бы лучше использовать Java 8 java.time классы, которые неизменны, вместо java.util.Date или использовать Joda Time, если вы не используете Java 8.

+0

За исключением переменной даты, все остальное в порядке? Я сделал то, что лучше? –

+0

@Nexusfactor Да, для остальных ваш класс в порядке. – Jesper

+0

Я обновил свой пост, я установил его на дату. Спасибо за помощь. –

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