001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache License, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * https://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017package org.apache.commons.lang3.mutable; 018 019import java.util.concurrent.atomic.AtomicInteger; 020 021/** 022 * A mutable {@code byte} wrapper. 023 * <p> 024 * This class was created before the introduction of the the {@link java.util.concurrent.atomic} package and the {@link AtomicInteger} class. 025 * </p> 026 * <p> 027 * Note that as MutableByte does not extend Byte, it is not treated by String.format as a Byte parameter. 028 * </p> 029 * 030 * @see Byte 031 * @see AtomicInteger 032 * @since 2.1 033 */ 034public class MutableByte extends Number implements Comparable<MutableByte>, Mutable<Number> { 035 036 /** 037 * Required for serialization support. 038 * 039 * @see java.io.Serializable 040 */ 041 private static final long serialVersionUID = -1585823265L; 042 043 /** The mutable value. */ 044 private byte value; 045 046 /** 047 * Constructs a new MutableByte with the default value of zero. 048 */ 049 public MutableByte() { 050 } 051 052 /** 053 * Constructs a new MutableByte with the specified value. 054 * 055 * @param value the initial value to store 056 */ 057 public MutableByte(final byte value) { 058 this.value = value; 059 } 060 061 /** 062 * Constructs a new MutableByte with the specified value. 063 * 064 * @param value the initial value to store, not null. 065 * @throws NullPointerException if the object is null. 066 */ 067 public MutableByte(final Number value) { 068 this.value = value.byteValue(); 069 } 070 071 /** 072 * Constructs a new MutableByte parsing the given string. 073 * 074 * @param value the string to parse, not null. 075 * @throws NumberFormatException if the string cannot be parsed into a byte, see {@link Byte#parseByte(String)}. 076 * @since 2.5 077 */ 078 public MutableByte(final String value) { 079 this.value = Byte.parseByte(value); 080 } 081 082 /** 083 * Adds a value to the value of this instance. 084 * 085 * @param operand the value to add, not null. 086 * @since 2.2 087 */ 088 public void add(final byte operand) { 089 this.value += operand; 090 } 091 092 /** 093 * Adds a value to the value of this instance. 094 * 095 * @param operand the value to add, not null. 096 * @throws NullPointerException if the object is null. 097 * @since 2.2 098 */ 099 public void add(final Number operand) { 100 this.value += operand.byteValue(); 101 } 102 103 /** 104 * Increments this instance's value by {@code operand}; this method returns the value associated with the instance 105 * immediately after the addition operation. This method is not thread safe. 106 * 107 * @param operand the quantity to add, not null. 108 * @return the value associated with this instance after adding the operand. 109 * @since 3.5 110 */ 111 public byte addAndGet(final byte operand) { 112 this.value += operand; 113 return value; 114 } 115 116 /** 117 * Increments this instance's value by {@code operand}; this method returns the value associated with the instance 118 * immediately after the addition operation. This method is not thread safe. 119 * 120 * @param operand the quantity to add, not null. 121 * @throws NullPointerException if {@code operand} is null. 122 * @return the value associated with this instance after adding the operand. 123 * @since 3.5 124 */ 125 public byte addAndGet(final Number operand) { 126 this.value += operand.byteValue(); 127 return value; 128 } 129 130 // shortValue relies on Number implementation 131 /** 132 * Returns the value of this MutableByte as a byte. 133 * 134 * @return the numeric value represented by this object after conversion to type byte. 135 */ 136 @Override 137 public byte byteValue() { 138 return value; 139 } 140 141 /** 142 * Compares this mutable to another in ascending order. 143 * 144 * @param other the other mutable to compare to, not null. 145 * @return negative if this is less, zero if equal, positive if greater. 146 */ 147 @Override 148 public int compareTo(final MutableByte other) { 149 return Byte.compare(this.value, other.value); 150 } 151 152 /** 153 * Decrements the value. 154 * 155 * @since 2.2 156 */ 157 public void decrement() { 158 value--; 159 } 160 161 /** 162 * Decrements this instance's value by 1; this method returns the value associated with the instance 163 * immediately after the decrement operation. This method is not thread safe. 164 * 165 * @return the value associated with the instance after it is decremented. 166 * @since 3.5 167 */ 168 public byte decrementAndGet() { 169 value--; 170 return value; 171 } 172 173 /** 174 * Returns the value of this MutableByte as a double. 175 * 176 * @return the numeric value represented by this object after conversion to type double. 177 */ 178 @Override 179 public double doubleValue() { 180 return value; 181 } 182 183 /** 184 * Compares this object to the specified object. The result is {@code true} if and only if the argument is 185 * not {@code null} and is a {@link MutableByte} object that contains the same {@code byte} value 186 * as this object. 187 * 188 * @param obj the object to compare with, null returns false. 189 * @return {@code true} if the objects are the same; {@code false} otherwise. 190 */ 191 @Override 192 public boolean equals(final Object obj) { 193 if (obj instanceof MutableByte) { 194 return value == ((MutableByte) obj).byteValue(); 195 } 196 return false; 197 } 198 199 /** 200 * Returns the value of this MutableByte as a float. 201 * 202 * @return the numeric value represented by this object after conversion to type float. 203 */ 204 @Override 205 public float floatValue() { 206 return value; 207 } 208 209 /** 210 * Increments this instance's value by {@code operand}; this method returns the value associated with the instance 211 * immediately prior to the addition operation. This method is not thread safe. 212 * 213 * @param operand the quantity to add, not null. 214 * @return the value associated with this instance immediately before the operand was added. 215 * @since 3.5 216 */ 217 public byte getAndAdd(final byte operand) { 218 final byte last = value; 219 this.value += operand; 220 return last; 221 } 222 223 /** 224 * Increments this instance's value by {@code operand}; this method returns the value associated with the instance 225 * immediately prior to the addition operation. This method is not thread safe. 226 * 227 * @param operand the quantity to add, not null. 228 * @throws NullPointerException if {@code operand} is null. 229 * @return the value associated with this instance immediately before the operand was added. 230 * @since 3.5 231 */ 232 public byte getAndAdd(final Number operand) { 233 final byte last = value; 234 this.value += operand.byteValue(); 235 return last; 236 } 237 238 /** 239 * Decrements this instance's value by 1; this method returns the value associated with the instance 240 * immediately prior to the decrement operation. This method is not thread safe. 241 * 242 * @return the value associated with the instance before it was decremented. 243 * @since 3.5 244 */ 245 public byte getAndDecrement() { 246 final byte last = value; 247 value--; 248 return last; 249 } 250 251 /** 252 * Increments this instance's value by 1; this method returns the value associated with the instance 253 * immediately prior to the increment operation. This method is not thread safe. 254 * 255 * @return the value associated with the instance before it was incremented. 256 * @since 3.5 257 */ 258 public byte getAndIncrement() { 259 final byte last = value; 260 value++; 261 return last; 262 } 263 264 /** 265 * Gets the value as a Byte instance. 266 * 267 * @return the value as a Byte, never null. 268 * @deprecated Use {@link #get()}. 269 */ 270 @Deprecated 271 @Override 272 public Byte getValue() { 273 return Byte.valueOf(this.value); 274 } 275 276 /** 277 * Returns a suitable hash code for this mutable. 278 * 279 * @return a suitable hash code. 280 */ 281 @Override 282 public int hashCode() { 283 return value; 284 } 285 286 /** 287 * Increments the value. 288 * 289 * @since 2.2 290 */ 291 public void increment() { 292 value++; 293 } 294 295 /** 296 * Increments this instance's value by 1; this method returns the value associated with the instance 297 * immediately after the increment operation. This method is not thread safe. 298 * 299 * @return the value associated with the instance after it is incremented. 300 * @since 3.5 301 */ 302 public byte incrementAndGet() { 303 value++; 304 return value; 305 } 306 307 /** 308 * Returns the value of this MutableByte as an int. 309 * 310 * @return the numeric value represented by this object after conversion to type int. 311 */ 312 @Override 313 public int intValue() { 314 return value; 315 } 316 317 /** 318 * Returns the value of this MutableByte as a long. 319 * 320 * @return the numeric value represented by this object after conversion to type long. 321 */ 322 @Override 323 public long longValue() { 324 return value; 325 } 326 327 /** 328 * Sets the value. 329 * 330 * @param value the value to set. 331 */ 332 public void setValue(final byte value) { 333 this.value = value; 334 } 335 336 /** 337 * Sets the value from any Number instance. 338 * 339 * @param value the value to set, not null. 340 * @throws NullPointerException if the object is null. 341 */ 342 @Override 343 public void setValue(final Number value) { 344 this.value = value.byteValue(); 345 } 346 347 /** 348 * Subtracts a value from the value of this instance. 349 * 350 * @param operand the value to subtract, not null. 351 * @since 2.2 352 */ 353 public void subtract(final byte operand) { 354 this.value -= operand; 355 } 356 357 /** 358 * Subtracts a value from the value of this instance. 359 * 360 * @param operand the value to subtract, not null. 361 * @throws NullPointerException if the object is null. 362 * @since 2.2 363 */ 364 public void subtract(final Number operand) { 365 this.value -= operand.byteValue(); 366 } 367 368 /** 369 * Gets this mutable as an instance of Byte. 370 * 371 * @return a Byte instance containing the value from this mutable. 372 */ 373 public Byte toByte() { 374 return Byte.valueOf(byteValue()); 375 } 376 377 /** 378 * Returns the String value of this mutable. 379 * 380 * @return the mutable value as a string. 381 */ 382 @Override 383 public String toString() { 384 return String.valueOf(value); 385 } 386 387}