Kiedy używać wrapper class I primitive type

Kiedy powinienem iść na zajęcia z wrapperem nad prymitywnymi typami? Albo w jakich okolicznościach powinienem wybrać między wrapperem / prymitywnym typem?

Author: Gopi, 2009-10-15

9 answers

Inni wspominali, że niektóre konstrukcje, takie jak Collections wymagają obiektów i że obiekty mają więcej kosztów niż ich prymitywne odpowiedniki (pamięć i boks).

Inna uwaga to:

Może być przydatne zainicjowanie obiektów na null lub wysłanie null parametrów do metody/konstruktora w celu wskazania stanu lub funkcji. Nie da się tego zrobić z prymitywami.

Wielu programistów inicjalizuje liczby na 0 (domyślnie) lub -1, aby to oznaczać, ale w zależności od scenariusz, może to być nieprawidłowe lub wprowadzające w błąd.

To również ustawi scenę dla NullPointerException, gdy coś jest używane nieprawidłowo, co jest znacznie bardziej przyjazne dla programistów niż jakiś arbitralny błąd.

 51
Author: pstanton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-21 07:15:57

Ogólnie rzecz biorąc, powinieneś używać typów prymitywnych, chyba że potrzebujesz obiektu z jakiegoś powodu (np. aby umieścić w kolekcji). Nawet wtedy rozważ inne podejście, które nie wymaga obiektu, jeśli chcesz zmaksymalizować wydajność numeryczną. Jest to zalecane przez Dokumentacja i Ten artykuł pokazuje, w jaki sposób auto-boks może powodować dużą różnicę w wydajności.

 13
Author: Matthew Flaschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 06:07:15

Moim zdaniem, jeśli członkowie mojej klasy są zmiennymi wrappera, nie zależy to od wartości domyślnych, co jest zachowaniem przyjaznym dla programistów.

1.

class Person {
   int SSN ; // gets initialized to zero by default 
}

2.

class PersonBetter {
  Integer SSN; //gets initialized to null by default
}

W pierwszym przypadku, nie można zachować wartość SSN niezaliczaną. Może to zaszkodzić, jeśli nie sprawdzasz, czy wartość została ustawiona przed próbą jej użycia.

W drugim przypadku, można zachować SSN zainicjowany przez null. Co może prowadzić do NullPointerException, ale jest to lepsze niż nieświadomie wstawianie wartości domyślne (zero) jako SSN do bazy danych za każdym razem, gdy próbujesz go użyć bez inicjalizacji pola SSN.

 7
Author: Cody,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-12 17:11:16

Używam tylko tych rodzajów opakowań, jeśli musisz.

Używając ich niewiele zyskujesz, poza tym, że są Objects.

I tracisz nadmiarowe zużycie pamięci i czas spędzony na boksie/rozpakowywaniu.

 6
Author: jjnguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 05:21:35

Kolekcje są typowym przypadkiem dla prostych obiektów wrappera Javy. Można jednak rozważyć nadanie owijce bardziej konkretnego znaczenia w kodzie (obiekt value).

IMHO prawie zawsze jest korzyść z używania obiektów wartości, gdy sprowadza się to do czytelności i utrzymania kodu. Zawijanie prostych struktur danych wewnątrz obiektów, gdy mają one określone obowiązki, często upraszcza kod. Jest to coś, co jest bardzo ważne w Domain-Driven Design .

Istnieje oczywiście problem wydajności, ale mam tendencję do ignorowania tego, dopóki nie mam możliwości pomiaru wydajności z odpowiednimi danymi i zrobić bardziej ukierunkowane działania w kierunku problematycznego obszaru. Może być również łatwiej zrozumieć problem z wydajnością, jeśli kod jest łatwy do zrozumienia.

 3
Author: Mattias Holmqvist,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 06:25:09

Wydajność aplikacji, które są zdominowane przez obliczenia numeryczne, mogą znacznie skorzystać z wykorzystania prymitywów.

Typy prymitywne, używa się operatora==, ale w przypadku wrappera preferowanym wyborem jest wywołanie metody equals ().

"typy prymitywne uważane za szkodliwe" , ponieważ mieszają " semantykę proceduralną w inny sposób jednolity obiektowy model.

Wielu programistów inicjalizuje liczby na 0 (domyślnie) lub -1, aby oznaczać to, ale w zależności od scenariusza, może to być nieprawidłowe lub wprowadzające w błąd.

 2
Author: loknath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-29 06:42:03

Jeśli chcesz utworzyć typ wartości. Coś w rodzaju produktu lub AirportCode.

Gdy prymitywny typ (string w moich przykładach) definiuje równość, będziesz chciał ją zastąpić.

 1
Author: Chris Missal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 05:20:49

Jeśli chcesz używać kolekcji, Musisz używać klas Wrapper.

Typy prymitywne, są używane dla tablic. Ponadto, aby reprezentować dane, które nie mają zachowania, na przykład licznik lub warunek logiczny.

Od czasu autoboxingu granica "kiedy używać primitive lub wrapper" stała się dość niejasna.

Ale pamiętaj, Wrappery są obiektami, więc masz wszystkie fantazyjne funkcje Javy. Na przykład, można użyć reflexion do tworzenia obiektów typu Integer, ale nie wartości int. Klasy Wrapper posiadają również metody takie jak valueOf.

 1
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-15 05:26:58

Praktycznie spotkałem się z sytuacją, w której użycie klasy wrapper może być wyjaśnione.

Utworzyłem klasę usług, która miała zmienną typu long

  1. jeśli zmienna jest typu long - gdy nie jest zainicjalizowana, zostanie ustawiona na 0 - będzie to mylące dla użytkownika, gdy zostanie wyświetlona w GUI
  2. jeśli zmienna jest typu Long - gdy nie jest zainicjalizowana, zostanie ustawiona na null - ta wartość null nie pojawi się w GUI.

Dotyczy to Boolean jako dobrze, gdzie wartości mogą być bardziej mylące, gdy używamy primitive boolean (jako wartość domyślna jest false).

 1
Author: Mohamed Afzal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-04 06:17:25