1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package java.lang;
19
20/**
21 * The wrapper for the primitive type {@code byte}.
22 *
23 * @since 1.1
24 */
25@FindBugsSuppressWarnings("DM_NUMBER_CTOR")
26public final class Byte extends Number implements Comparable<Byte> {
27
28    private static final long serialVersionUID = -7183698231559129828L;
29
30    /**
31     * The value which the receiver represents.
32     */
33    private final byte value;
34
35    /**
36     * The maximum {@code Byte} value, 2<sup>7</sup>-1.
37     */
38    public static final byte MAX_VALUE = (byte) 0x7F;
39
40    /**
41     * The minimum {@code Byte} value, -2<sup>7</sup>.
42     */
43    public static final byte MIN_VALUE = (byte) 0x80;
44
45    /**
46     * The number of bits needed to represent a {@code Byte} value in two's
47     * complement form.
48     *
49     * @since 1.5
50     */
51    public static final int SIZE = 8;
52
53    /**
54     * The {@link Class} object that represents the primitive type {@code byte}.
55     */
56    @SuppressWarnings("unchecked")
57    public static final Class<Byte> TYPE
58            = (Class<Byte>) byte[].class.getComponentType();
59    // Note: Byte.TYPE can't be set to "byte.class", since *that* is
60    // defined to be "java.lang.Byte.TYPE";
61
62    /**
63     * Constructs a new {@code Byte} with the specified primitive byte value.
64     *
65     * @param value
66     *            the primitive byte value to store in the new instance.
67     */
68    public Byte(byte value) {
69        this.value = value;
70    }
71
72    /**
73     * Constructs a new {@code Byte} from the specified string.
74     *
75     * @param string
76     *            the string representation of a single byte value.
77     * @throws NumberFormatException
78     *             if {@code string} cannot be parsed as a byte value.
79     * @see #parseByte(String)
80     */
81    public Byte(String string) throws NumberFormatException {
82        this(parseByte(string));
83    }
84
85    /**
86     * Gets the primitive value of this byte.
87     *
88     * @return this object's primitive value.
89     */
90    @Override
91    public byte byteValue() {
92        return value;
93    }
94
95    /**
96     * Compares this object to the specified byte object to determine their
97     * relative order.
98     *
99     * @param object
100     *            the byte object to compare this object to.
101     * @return a negative value if the value of this byte is less than the value
102     *         of {@code object}; 0 if the value of this byte and the value of
103     *         {@code object} are equal; a positive value if the value of this
104     *         byte is greater than the value of {@code object}.
105     * @see java.lang.Comparable
106     * @since 1.2
107     */
108    public int compareTo(Byte object) {
109        return compare(value, object.value);
110    }
111
112    /**
113     * Compares two {@code byte} values.
114     * @return 0 if lhs = rhs, less than 0 if lhs &lt; rhs, and greater than 0 if lhs &gt; rhs.
115     * @since 1.7
116     * @hide 1.7
117     */
118    public static int compare(byte lhs, byte rhs) {
119        return lhs > rhs ? 1 : (lhs < rhs ? -1 : 0);
120    }
121
122    /**
123     * Parses the specified string and returns a {@code Byte} instance if the
124     * string can be decoded into a single byte value. The string may be an
125     * optional minus sign "-" followed by a hexadecimal ("0x..." or "#..."),
126     * octal ("0..."), or decimal ("...") representation of a byte.
127     *
128     * @param string
129     *            a string representation of a single byte value.
130     * @return a {@code Byte} containing the value represented by {@code string}.
131     * @throws NumberFormatException
132     *             if {@code string} cannot be parsed as a byte value.
133     */
134    public static Byte decode(String string) throws NumberFormatException {
135        int intValue = Integer.decode(string);
136        byte result = (byte) intValue;
137        if (result == intValue) {
138            return valueOf(result);
139        }
140        throw new NumberFormatException("Value out of range for byte: \"" + string + "\"");
141    }
142
143    @Override
144    public double doubleValue() {
145        return value;
146    }
147
148    /**
149     * Compares this object with the specified object and indicates if they are
150     * equal. In order to be equal, {@code object} must be an instance of
151     * {@code Byte} and have the same byte value as this object.
152     *
153     * @param object
154     *            the object to compare this byte with.
155     * @return {@code true} if the specified object is equal to this
156     *         {@code Byte}; {@code false} otherwise.
157     */
158    @Override
159    @FindBugsSuppressWarnings("RC_REF_COMPARISON")
160    public boolean equals(Object object) {
161        return (object == this) || ((object instanceof Byte) && (((Byte) object).value == value));
162    }
163
164    @Override
165    public float floatValue() {
166        return value;
167    }
168
169    @Override
170    public int hashCode() {
171        return value;
172    }
173
174    @Override
175    public int intValue() {
176        return value;
177    }
178
179    @Override
180    public long longValue() {
181        return value;
182    }
183
184    /**
185     * Parses the specified string as a signed decimal byte value. The ASCII
186     * character \u002d ('-') is recognized as the minus sign.
187     *
188     * @param string
189     *            the string representation of a single byte value.
190     * @return the primitive byte value represented by {@code string}.
191     * @throws NumberFormatException
192     *             if {@code string} can not be parsed as a byte value.
193     */
194    public static byte parseByte(String string) throws NumberFormatException {
195        return parseByte(string, 10);
196    }
197
198    /**
199     * Parses the specified string as a signed byte value using the specified
200     * radix. The ASCII character \u002d ('-') is recognized as the minus sign.
201     *
202     * @param string
203     *            the string representation of a single byte value.
204     * @param radix
205     *            the radix to use when parsing.
206     * @return the primitive byte value represented by {@code string} using
207     *         {@code radix}.
208     * @throws NumberFormatException
209     *             if {@code string} can not be parsed as a byte value, or
210     *             {@code radix < Character.MIN_RADIX ||
211     *             radix > Character.MAX_RADIX}.
212     */
213    public static byte parseByte(String string, int radix) throws NumberFormatException {
214        int intValue = Integer.parseInt(string, radix);
215        byte result = (byte) intValue;
216        if (result == intValue) {
217            return result;
218        }
219        throw new NumberFormatException("Value out of range for byte: \"" + string + "\"");
220    }
221
222    @Override
223    public short shortValue() {
224        return value;
225    }
226
227    @Override
228    public String toString() {
229        return Integer.toString(value);
230    }
231
232    /**
233     * Returns a two-digit hex string. That is, -1 becomes "ff" or "FF" and 2 becomes "02".
234     * @hide internal use only
235     */
236    public static String toHexString(byte b, boolean upperCase) {
237        return IntegralToString.byteToHexString(b, upperCase);
238    }
239
240    /**
241     * Returns a string containing a concise, human-readable description of the
242     * specified byte value.
243     *
244     * @param value
245     *            the byte to convert to a string.
246     * @return a printable representation of {@code value}.
247     */
248    public static String toString(byte value) {
249        return Integer.toString(value);
250    }
251
252    /**
253     * Parses the specified string as a signed decimal byte value.
254     *
255     * @param string
256     *            the string representation of a single byte value.
257     * @return a {@code Byte} instance containing the byte value represented by
258     *         {@code string}.
259     * @throws NumberFormatException
260     *             if {@code string} can not be parsed as a byte value.
261     * @see #parseByte(String)
262     */
263    public static Byte valueOf(String string) throws NumberFormatException {
264        return valueOf(parseByte(string));
265    }
266
267    /**
268     * Parses the specified string as a signed byte value using the specified
269     * radix.
270     *
271     * @param string
272     *            the string representation of a single byte value.
273     * @param radix
274     *            the radix to use when parsing.
275     * @return a {@code Byte} instance containing the byte value represented by
276     *         {@code string} using {@code radix}.
277     * @throws NumberFormatException
278     *             if {@code string} can not be parsed as a byte value, or
279     *             {@code radix < Character.MIN_RADIX ||
280     *             radix > Character.MAX_RADIX}.
281     * @see #parseByte(String, int)
282     */
283    public static Byte valueOf(String string, int radix) throws NumberFormatException {
284        return valueOf(parseByte(string, radix));
285    }
286
287    /**
288     * Returns a {@code Byte} instance for the specified byte value.
289     * <p>
290     * If it is not necessary to get a new {@code Byte} instance, it is
291     * recommended to use this method instead of the constructor, since it
292     * maintains a cache of instances which may result in better performance.
293     *
294     * @param b
295     *            the byte value to store in the instance.
296     * @return a {@code Byte} instance containing {@code b}.
297     * @since 1.5
298     */
299    public static Byte valueOf(byte b) {
300        return VALUES[b + 128];
301    }
302
303    /**
304     * A cache of instances used by {@link Byte#valueOf(byte)} and auto-boxing
305     */
306    private static final Byte[] VALUES = new Byte[256];
307
308    static {
309        for (int i = -128; i < 128; i++) {
310            VALUES[i + 128] = new Byte((byte) i);
311        }
312    }
313}
314