View Javadoc
1   /*
2    * Copyright (C) 2020-2023 Dipl.-Inform. Kai Hofmann. All rights reserved!
3    */
4   package de.powerstat.validation.values;
5   
6   
7   import java.util.Objects;
8   import java.util.regex.Pattern;
9   
10  import de.powerstat.validation.interfaces.IValueObject;
11  
12  
13  /**
14   * Address Department.
15   *
16   * Not DSGVO relevant.
17   */
18  public final class Department implements Comparable<Department>, IValueObject
19   {
20    /* *
21     * Cache for singletons.
22     */
23    // private static final Map<String, Department> CACHE = new WeakHashMap<>();
24  
25    /**
26     * Department regexp.
27     */
28    private static final Pattern DEPARTMENT_REGEXP = Pattern.compile("^[\\p{L}][\\p{L}\\\\p{Digi}.& -]*$"); //$NON-NLS-1$
29  
30    /**
31     * Department.
32     */
33    private final String department;
34  
35  
36    /**
37     * Constructor.
38     *
39     * @param department Department name
40     * @throws NullPointerException if department is null
41     * @throws IllegalArgumentException if department is not a correct department name
42     */
43    private Department(final String department)
44     {
45      super();
46      Objects.requireNonNull(department, "department"); //$NON-NLS-1$
47      if ((department.length() < 1) || (department.length() > 64))
48       {
49        throw new IllegalArgumentException("Department with wrong length"); //$NON-NLS-1$
50       }
51      if (!Department.DEPARTMENT_REGEXP.matcher(department).matches())
52       {
53        throw new IllegalArgumentException("Department with wrong format"); //$NON-NLS-1$
54       }
55      this.department = department;
56     }
57  
58  
59    /**
60     * Department factory.
61     *
62     * @param department Department name
63     * @return Department object
64     */
65    public static Department of(final String department)
66     {
67      /*
68      synchronized (Department.class)
69       {
70        Department obj = Department.CACHE.get(department);
71        if (obj != null)
72         {
73          return obj;
74         }
75        obj = new Department(department);
76        Department.CACHE.put(department, obj);
77        return obj;
78       }
79      */
80      return new Department(department);
81     }
82  
83  
84    /**
85     * Returns the value of this Department as a string.
86     *
87     * @return he text value represented by this object after conversion to type string.
88     */
89    @Override
90    public String stringValue()
91     {
92      return this.department;
93     }
94  
95  
96    /**
97     * Calculate hash code.
98     *
99     * @return Hash
100    * @see java.lang.Object#hashCode()
101    */
102   @Override
103   public int hashCode()
104    {
105     return this.department.hashCode();
106    }
107 
108 
109   /**
110    * Is equal with another object.
111    *
112    * @param obj Object
113    * @return true when equal, false otherwise
114    * @see java.lang.Object#equals(java.lang.Object)
115    */
116   @Override
117   public boolean equals(final Object obj)
118    {
119     if (this == obj)
120      {
121       return true;
122      }
123     if (!(obj instanceof Department))
124      {
125       return false;
126      }
127     final Department other = (Department)obj;
128     return this.department.equals(other.department);
129    }
130 
131 
132   /**
133    * Returns the string representation of this Department.
134    *
135    * The exact details of this representation are unspecified and subject to change, but the following may be regarded as typical:
136    *
137    * "Department[department=Research]"
138    *
139    * @return String representation of this Department
140    * @see java.lang.Object#toString()
141    */
142   @Override
143   public String toString()
144    {
145     final var builder = new StringBuilder(23);
146     builder.append("Department[department=").append(this.department).append(']'); //$NON-NLS-1$
147     return builder.toString();
148    }
149 
150 
151   /**
152    * Compare with another object.
153    *
154    * @param obj Object to compare with
155    * @return 0: equal; 1: greater; -1: smaller
156    * @see java.lang.Comparable#compareTo(java.lang.Object)
157    */
158   @Override
159   public int compareTo(final Department obj)
160    {
161     Objects.requireNonNull(obj, "obj"); //$NON-NLS-1$
162     return this.department.compareTo(obj.department);
163    }
164 
165  }