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 Sub building.
15   *
16   * Possibly DSGVO relevant.
17   */
18  public final class SubBuilding implements Comparable<SubBuilding>, IValueObject
19   {
20    /* *
21     * Cache for singletons.
22     */
23    // private static final Map<String, SubBuilding> CACHE = new WeakHashMap<>();
24  
25    /**
26     * Subbuilding regexp.
27     */
28    private static final Pattern SUBBUILDING_REGEXP = Pattern.compile("^[\\p{L}][\\p{L}\\p{Digit}., -]*$"); //$NON-NLS-1$
29  
30    /**
31     * Sub building.
32     */
33    private final String subBuilding;
34  
35  
36    /**
37     * Constructor.
38     *
39     * @param subBuilding Sub building description
40     * @throws NullPointerException if subBuilding is null
41     * @throws IllegalArgumentException if subBuilding is not correct
42     */
43    private SubBuilding(final String subBuilding)
44     {
45      super();
46      Objects.requireNonNull(subBuilding, "subBuilding"); //$NON-NLS-1$
47      if ((subBuilding.length() < 1) || (subBuilding.length() > 32))
48       {
49        throw new IllegalArgumentException("SubBuilding with wrong length"); //$NON-NLS-1$
50       }
51      if (!SubBuilding.SUBBUILDING_REGEXP.matcher(subBuilding).matches())
52       {
53        throw new IllegalArgumentException("SubBuilding with wrong format"); //$NON-NLS-1$
54       }
55      this.subBuilding = subBuilding;
56     }
57  
58  
59    /**
60     * SubBuilding factory.
61     *
62     * @param subBuilding Sub building
63     * @return SubBuilding object
64     */
65    public static SubBuilding of(final String subBuilding)
66     {
67      /*
68      synchronized (SubBuilding.class)
69       {
70        SubBuilding obj = SubBuilding.CACHE.get(subBuilding);
71        if (obj != null)
72         {
73          return obj;
74         }
75        obj = new SubBuilding(subBuilding);
76        SubBuilding.CACHE.put(subBuilding, obj);
77        return obj;
78       }
79      */
80      return new SubBuilding(subBuilding);
81     }
82  
83  
84    /**
85     * Returns the value of this SubBuilding as a string.
86     *
87     * @return The text value represented by this object after conversion to type string.
88     */
89    @Override
90    public String stringValue()
91     {
92      return this.subBuilding;
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.subBuilding.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 SubBuilding))
124      {
125       return false;
126      }
127     final SubBuilding other = (SubBuilding)obj;
128     return this.subBuilding.equals(other.subBuilding);
129    }
130 
131 
132   /**
133    * Returns the string representation of this SubBuilding.
134    *
135    * The exact details of this representation are unspecified and subject to change, but the following may be regarded as typical:
136    *
137    * "SubBuilding[subBuilding=Floor 13, Apart. 0815]"
138    *
139    * @return String representation of this SubBuilding
140    * @see java.lang.Object#toString()
141    */
142   @Override
143   public String toString()
144    {
145     final var builder = new StringBuilder(25);
146     builder.append("SubBuilding[subBuilding=").append(this.subBuilding).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 SubBuilding obj)
160    {
161     Objects.requireNonNull(obj, "obj"); //$NON-NLS-1$
162     return this.subBuilding.compareTo(obj.subBuilding);
163    }
164 
165  }