2011-02-03 12 views
9

w Javie, mogę napisać kod jak tenW jaki sposób tworzona jest instancja klasy Java Boolean?

Boolean b = true ; 

i będzie działać. Mam teraz obiekt, który ma wartość "true".

Jak to działa? Dlaczego nie muszę przekazywać wartości przez konstruktor? Podobnie jak:

Boolean b = new Boolean(true) ; 

Czy mogę tworzyć niestandardowe klasy, które mogę utworzyć w podobny sposób? Jeśli tak, to co się nazywa?

Tak, że mogę zrobić coś takiego:

Foobar foobar = "Test" ; 

A zatem mieć własne klasy otoki.

Dzięki

+0

To się nazywa autoboxing. Googling "java autoboxing" dostarczy wiele informacji o tym, czego jesteś świadkiem. –

+2

Ta ostatnia część wymaga więcej maszyn niż zapewnia Java. W scala na przykład można to prawdopodobnie zrobić za pomocą implikacji. – svrist

+0

Dziękuję wszystkim, nigdy wcześniej nie słyszałem terminu "autoboxing". – CrazyPenguin

Odpowiedz

13

No nie można zrobić tego ostatniego.

Pierwszy z nich nazywa się autoboxing i został wprowadzony w Javie w wersji 1.5 do automatycznego zawijania, prymitywów w ich odpowiedniku opakowania.

Korzyść z autoboxing może być wyraźnie widoczne przy użyciu rodzajowych i/lub kolekcje:

Z artykułu: J2SE 5.0 in a Nutshell

W „autoboxing i Auto-Unboxing od prymitywnych typów” próbki my mieć

przed (autoboxing dodano)

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(0, new Integer(42)); 
int total = (list.get(0)).intValue(); 

Po

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(0, 42); 
int total = list.get(0); 

Jak widać, kod jest bardziej wyraźny.

Wystarczy pamiętać ostatnią notatkę w dokumentacji:

Więc kiedy należy użyć autoboxing i unboxing? Używaj ich tylko wtedy, gdy występuje "niedopasowanie impedancji" pomiędzy typami odniesienia i prymitywami, na przykład, gdy musisz umieścić wartości liczbowe w kolekcji. Nie jest właściwe używanie autoboxingu i rozpakowywania w celu obliczeń naukowych lub innego kodu liczbowego wrażliwego na wydajność. Liczba całkowita nie jest substytutem int; autoboxing i unboxing zamazują rozróżnienie między typami pierwotnymi i referencyjnymi, ale nie eliminują go.

1

To ten sam sposób, że można dokonać obiektów String jako takie:

String s = "foobar" 

To tylko dodatkiem w Javie, naprawdę. Nie jestem pewien, dlaczego chciałbyś utworzyć własną klasę opakowania, biorąc pod uwagę, że każdy pierwotny typ danych ma już predefiniowane opakowanie ...

+0

Nie mam praktycznej potrzeby, ale zdałem sobie sprawę, że nie wiem, jak to działa, i bez znajomości frazy "autoboxing" było kilka bezowocnych wyszukiwań google – CrazyPenguin

0

Nazywa się autoboxing i jest po prostu czymś, co kompilator robi dla Ciebie. Został dodany tylko w Javie 5, wcześniej trzeba było użyć new Boolean(true) lub (lepiej) Boolean.TRUE.

I nie, nie możesz go mieć dla własnych klas, dotyczy to tylko klas prymitywnych.

3

Jak to działa?

Jest to funkcja kompilatora. Kompilator automatycznie wygeneruje operację boksowania. Co będzie to faktycznie jest generowanie

Boolean.valueOf(true); 

ponieważ w ten sposób istniejące (niezmienne) przypadki Boolean.TRUE i Boolean.FALSE zostaną wykorzystane zamiast tworzenia nowej.

1

Ta funkcja została dodana do wersji Java 1.5 i nosi nazwę Autoboxing. Ten rodzaj magii dostępny tylko dla prymitywnych wartości i opakowań korespondentowych.

Nie można tego zrobić samodzielnie w Javie. Jeśli nadal chcesz, to przejdź do Scala - to świetnie! Mianowicie możesz użyć funkcji o nazwie implicit conversions. Oto mały przykład dla Twojego przypadku:

case class Foobar(value: String) 
implicit def convertStringToFoobar(s: String) = Foobar(s) 
val foobar: Foobar = "Test"; 
Powiązane problemy