@@ -45,22 +45,22 @@ public class TypeId {
4545 /**
4646 * Area number (defined as UShort by the MAL).
4747 */
48- private final short areaNumber ;
48+ private Short areaNumber = null ;
4949
5050 /**
5151 * Area version (defined as UShort by the MAL).
5252 */
53- private final short areaVersion ;
53+ private short areaVersion ;
5454
5555 /**
5656 * Service number (defined as UShort by the MAL).
5757 */
58- private final short serviceNumber ;
58+ private short serviceNumber ;
5959
6060 /**
6161 * Short Form Part number (defined as Short by the MAL).
6262 */
63- private final short sfp ;
63+ private short sfp ;
6464
6565 private Long typeId = null ;
6666
@@ -71,10 +71,6 @@ public class TypeId {
7171 */
7272 public TypeId (final Long typeId ) {
7373 this .typeId = typeId ;
74- this .areaNumber = (short ) ((typeId >> AREA_BIT_SHIFT ) & MASK_16 );
75- this .areaVersion = (short ) ((typeId >> VERSION_BIT_SHIFT ) & MASK_08 );
76- this .serviceNumber = (short ) ((typeId >> SERVICE_BIT_SHIFT ) & MASK_16 );
77- this .sfp = (short ) (typeId & MASK_24 );
7874 }
7975
8076 /**
@@ -108,12 +104,22 @@ public TypeId(final int areaNumber, final int areaVersion,
108104 this ((short ) areaNumber , (short ) areaVersion , (short ) serviceNumber , (short ) sfp );
109105 }
110106
107+ private void calculateIfNeeded () {
108+ if (areaNumber == null ) {
109+ areaNumber = (short ) ((typeId >> AREA_BIT_SHIFT ) & MASK_16 );
110+ areaVersion = (short ) ((typeId >> VERSION_BIT_SHIFT ) & MASK_08 );
111+ serviceNumber = (short ) ((typeId >> SERVICE_BIT_SHIFT ) & MASK_16 );
112+ sfp = (short ) (typeId & MASK_24 );
113+ }
114+ }
115+
111116 /**
112117 * Returns the area number of the service.
113118 *
114119 * @return The area number of the service.
115120 */
116121 public int getAreaNumber () {
122+ calculateIfNeeded ();
117123 return areaNumber ;
118124 }
119125
@@ -123,6 +129,7 @@ public int getAreaNumber() {
123129 * @return The area version of the service.
124130 */
125131 public int getAreaVersion () {
132+ calculateIfNeeded ();
126133 return areaVersion ;
127134 }
128135
@@ -132,6 +139,7 @@ public int getAreaVersion() {
132139 * @return The service number of the service.
133140 */
134141 public int getServiceNumber () {
142+ calculateIfNeeded ();
135143 return serviceNumber ;
136144 }
137145
@@ -141,6 +149,7 @@ public int getServiceNumber() {
141149 * @return True if this TypeId is from the old MAL, otherwise false.
142150 */
143151 public boolean isOldMAL () {
152+ calculateIfNeeded ();
144153 return (areaNumber == 1 && areaVersion < 3 );
145154 }
146155
@@ -150,6 +159,7 @@ public boolean isOldMAL() {
150159 * @return The short form part number.
151160 */
152161 public int getSFP () {
162+ calculateIfNeeded ();
153163 return sfp ;
154164 }
155165
@@ -159,6 +169,7 @@ public int getSFP() {
159169 * @return True if it represents a list type.
160170 */
161171 public boolean isList () {
172+ calculateIfNeeded ();
162173 return (sfp <= 0 );
163174 }
164175
@@ -190,12 +201,14 @@ public long getTypeId() {
190201 }
191202
192203 public TypeId generateTypeIdPositive () {
204+ calculateIfNeeded ();
193205 int newSPF = (sfp > 0 ) ? sfp : (-1 ) * sfp ;
194206 return new TypeId (areaNumber , areaVersion , serviceNumber , newSPF );
195207 }
196208
197209 @ Override
198210 public String toString () {
211+ calculateIfNeeded ();
199212 StringBuilder buf = new StringBuilder ();
200213 buf .append ("(TypeId: " );
201214 buf .append (" areaNumber=" ).append (areaNumber );
0 commit comments