Boxing

boxing.png

Integerとか大文字で始まるのはボクシング化されたデータである

ボクシングの利点

この機能は、java.util.Collectionクラスへの値の代入/取得で、Object型のみしか許されない場合などに威力を発揮します。

ボクシングの欠点

ボクシングされた基本データで演算するとちょっと遅くなる

// J2SE 5.0以上
Integer intObj = 127;    // ボクシング
int i = intObj;    // アンボクシング

Eclipseでボクシングのワーニングを出させるには?

> Java > Compiler > Errors/Warnings > Potential programming problems > Boxing and Unboxing

するとこんなワーニングが出る時がある

The expression of type char is boxed into Character

だからなんだ!?
何を注意してるのかというと、NullPointerExceptionが発生するかもしれませんよ、とか
新しいインスタンスが生成されてますよ!ということである。
ボクシング、アンボクシングする度にnewされてるんですね

Character ch = 'a';//The expression of type char is boxed into Character
Character ch = new Character('a');//これだとワーニングが出ない。

まぁ、メモリの容量に気を配らせるためにつけておいてもいいかもしれませんね

Autoboxing and Unboxing

AutoboxingとはJavaのコンパイラが自動的にプリミティブ型と対応するラッパークラスに変換してくれるということである。
たとえば、intが来たら、Integerクラスに自動的に変換してくれるってことだ。
また、逆の変換も自動的にしてくれて、それはunboxingと呼ばれる。

次の例が、単純な自動ボクシングの例である。

Character ch = 'a';//The expression of type char is boxed into Character

The rest of the examples in this section use generics.
If you are not yet familiar with the syntax of generics, see the Generics (Updated) lesson.

Consider the following code:

List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(i);//The expression of type int is boxed into Integer というwarningが出ることもある

Although you add the int values as primitive types, rather than Integer objects, to li, the code compiles.
Because li is a list of Integer objects, not a list of int values,
you may wonder why the Java compiler does not issue a compile-time error.
The compiler does not generate an error because it creates an Integer object from i and adds the object to li. Thus, the compiler converts the previous code to the following at runtime:
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
    li.add(Integer.valueOf(i));

Converting a primitive value (an int, for example) into an object of the corresponding wrapper class (Integer) is called autoboxing. The Java compiler applies autoboxing when a primitive value is:

Passed as a parameter to a method that expects an object of the corresponding wrapper class.
Assigned to a variable of the corresponding wrapper class.
Consider the following method:

public static int sumEven(List<Integer> li) {
int sum = 0;
for (Integer i: li)
if (i % 2 == 0)
sum += i;
return sum;
}
Because the remainder (%) and unary plus (+=) operators do not apply to Integer objects, you may wonder why the Java compiler compiles the method without issuing any errors. The compiler does not generate an error because it invokes the intValue method to convert an Integer to an int at runtime:

public static int sumEven(List<Integer> li) {
int sum = 0;
for (Integer i : li)
if (i.intValue() % 2 == 0)
sum += i.intValue();
return sum;
}
Converting an object of a wrapper type (Integer) to its corresponding primitive (int) value is called unboxing. The Java compiler applies unboxing when an object of a wrapper class is:

Passed as a parameter to a method that expects a value of the corresponding primitive type.
Assigned to a variable of the corresponding primitive type.
The Unboxing example shows how this works:

import java.util.ArrayList;
import java.util.List;

public class Unboxing {

public static void main(String[] args) {
Integer i = new Integer(-8);

// 1. Unboxing through method invocation
int absVal = absoluteValue(i);
System.out.println("absolute value of " + i + " = " + absVal);

List<Double> ld = new ArrayList<>();
ld.add(3.1416); // Π is autoboxed through method invocation.

// 2. Unboxing through assignment
double pi = ld.get(0);
System.out.println("pi = " + pi);
}

public static int absoluteValue(int i) {
return (i < 0) ? -i : i;
}
}
The program prints the following:

absolute value of -8 = 8
pi = 3.1416
Autoboxing and unboxing lets developers write cleaner code, making it easier to read. The following table lists the primitive types and their corresponding wrapper classes, which are used by the Java compiler for autoboxing and unboxing:

Primitive type Wrapper class
boolean Boolean
byte Byte
char Character
float Float
int Integer
long Long
short Short
double Double

サポートサイト Wikidot.com