Co to jest klasa opakowania?

221

Co to jest klasa opakowania?
W jaki sposób takie klasy są przydatne?

Bhaskar
źródło

Odpowiedzi:

171

Zasadniczo klasą opakowania jest każda klasa, która „otacza” lub „obudowuje” funkcjonalność innej klasy lub komponentu. Są one przydatne, ponieważ zapewniają poziom abstrakcji od implementacji podstawowej klasy lub komponentu; na przykład klasy opakowania, które otaczają komponenty COM, mogą zarządzać procesem wywoływania komponentu COM bez zawracania mu głowy kodem wywołującym. Mogą również uprościć korzystanie z obiektu leżącego pod spodem, zmniejszając liczbę zaangażowanych punktów interfejsu; często zapewnia to bezpieczniejsze korzystanie z podstawowych komponentów.

Paul Sonier
źródło
15
Klasa opakowania (jako adapter) jest używana, gdy opakowanie musi przestrzegać określonego interfejsu i musi obsługiwać zachowanie polimorficzne. Z drugiej strony fasadę stosuje się, gdy chce się łatwiejszego lub prostszego interfejsu do pracy.
Yadu
3
W tym poście, proponuje, że owinięcie może być przydatna do tworzenia ściśle zdefiniowaną proxy dla klasy późnym-bound: Czy mogę użyć późnego wiązania ... . Czy jest to ważne dodatkowe zastosowanie dla opakowań poza tym, co opisał Paul Sonier powyżej?
Todd
1
@NajajanSingh Wrapper ponownie wykorzystuje dwa już istniejące interfejsy i sprawia, że ​​jeden działa z drugim. Z drugiej strony fasada tworzy nowy interfejs.
Alireza,
67

Tak to brzmi: klasa, która „pakuje” funkcjonalność innej klasy lub interfejsu API w prostszy lub po prostu inny interfejs API.

Zobacz: Adapter wzór , wzór elewacji

Shog9
źródło
Tak! Często jest synonimem wzoru elewacji. W wielu dokumentach kodu widzę oczywistą metodę elewacji, opisaną jako „Wrapper to XX :: yy method” lub trochę objaśnienia, jak „Wrapper to XX :: yy method with obsługę wyjątków”.
Peter Krauss
41

Klasy opakowań zapewniają sposób używania typów pierwotnych jako obiektów. Dla każdej operacji podstawowej mamy klasę opakowania, taką jak,

int Integer
byte Byte 

Liczby całkowite i bajty są klasami opakowań pierwotnych liczb całkowitych i bajtów. Są czasy / ograniczenia, kiedy trzeba używać prymitywów jako obiektów, więc klasy opakowań zapewniają mechanizm o nazwie boksowanie / rozpakowywanie.

Pojęcie można dobrze zrozumieć w następującym przykładzie jako

double d = 135.0 d;
Double doubleWrapper = new Double(d);

int integerValue = doubleWrapper.intValue();
byte byteValue = doubleWrapper.byteValue();
string stringValue = doubleWrapper.stringValue();

więc w ten sposób możemy użyć typu klasy opakowania do konwersji na inne typy pierwotne. Ten typ konwersji jest używany, gdy trzeba przekonwertować typ pierwotny na obiekt i użyć go również do uzyskania innych elementów pierwotnych. Chociaż dla tego podejścia konieczne jest napisanie dużego kodu. Jednak to samo można osiągnąć za pomocą prostej techniki rzutowania, ponieważ fragment kodu można uzyskać jak poniżej

double d = 135.0;
int integerValue = (int) d ;

Chociaż podwójna wartość jest jawnie konwertowana na wartość całkowitą, zwaną również downcastingiem.

SBTec
źródło
1
Twoja odpowiedź sugeruje, że klasy opakowań są tylko dla prymitywnych obiektów.
Guillaume F.,
17

Klasa opakowania niekoniecznie musi zawierać inną klasę. Może to być funkcja zawijania klasy API, np. W pliku dll.

Na przykład może być bardzo przydatne utworzenie klasy otoki dll, która zajmuje się całą inicjalizacją i czyszczeniem dll oraz tworzenie metod klas, które otulają wskaźniki funkcji utworzone np GetProcAddress(). Z.

Twoje zdrowie !

ralphtheninja
źródło
8

Klasa otoki to klasa, która „otacza” coś innego, tak jak jego nazwa.

Bardziej formalną jego definicją byłaby klasa, która implementuje wzorzec adaptera . Pozwala to zmodyfikować jeden zestaw interfejsów API w bardziej użyteczną, czytelną formę. Na przykład w języku C #, jeśli chcesz użyć natywnego interfejsu API systemu Windows, pomaga on zawinąć go w klasę zgodną z wytycznymi projektowania .NET.

Reed Copsey
źródło
2
Według mojego zrozumienia wzorca adaptera różni się on od opakowania: jeśli X otacza Y, to X powinien obudować stan Y, ale nie jego tożsamość . Biorąc pod uwagę dwa wystąpienia X, z których oba zawijają Y, nie powinno być żadnych środków, za pomocą których można by udowodnić, że oba wystąpienia X zawijają to samo wystąpienie Y. Natomiast obiekt adaptera często hermetyzuje tożsamość, ale nie podaje stanu; zmiana adaptowanego obiektu nie byłaby uważana za zmianę samego adaptera.
supercat,
7

Warto również zauważyć, że w niektórych środowiskach znaczna część tego, co mogą zrobić klasy opakowań, jest zastępowana przez aspekty.

EDYTOWAĆ:

Ogólnie rzecz biorąc, opakowanie zamierza rozwinąć to, co robi opakowanie, bez obawy o jego implementację, w przeciwnym razie nie ma sensu zawijanie w porównaniu do rozszerzania owiniętej klasy. Typowym przykładem jest dodanie informacji o czasie lub funkcji rejestrowania wokół innego interfejsu usługi, a nie dodawanie go do każdej implementacji tego interfejsu.

W rezultacie jest to typowy przykład programowania aspektowego. Zamiast przechodzić przez funkcję interfejsu według funkcji i dodawać rejestrowanie danych kotłowych, w programowaniu aspektowym definiujesz punktowy, który jest rodzajem wyrażenia regularnego dla metod, a następnie deklarujesz metody, które chcesz wykonać przed, po lub wokół wszystkich pasujących metod punktowy. Prawdopodobnie słusznie jest powiedzieć, że programowanie aspektowe jest rodzajem zastosowania wzorca Dekoratora, do którego można również użyć klas opakowań, ale obie technologie mają inne zastosowania.

Jherico
źródło
7

Klasa opakowania jest klasą, która otacza inną klasę i zapewnia abstrakcję między opakowaną klasą klienta a klasą oryginalną.

Rakesh Verma
źródło
5

klasa opakowania jest zwykle klasą, która ma obiekt jako własność prywatną. opakowanie implementuje interfejs API tego obiektu prywatnego, dzięki czemu można go przekazać jako argument, w którym zrobiłby to obiekt prywatny.

powiedzmy, że masz kolekcję i chcesz użyć jakiegoś tłumaczenia podczas dodawania do niej obiektów - piszesz klasę opakowania, która ma wszystkie metody kolekcji. po wywołaniu metody add () opakowanie tłumaczy argumenty zamiast po prostu przekazuje je do prywatnej kolekcji.

opakowanie może być używane wszędzie tam, gdzie kolekcja może być używana, a obiekt prywatny może nadal mieć inne obiekty odnoszące się do niego i czytające go.

Amir Arad
źródło
1
Zgadzam się, moim osobistym poglądem na opakowania jest to, że wyglądają i wyglądają jak oryginalny typ i mogą implementować ten sam interfejs, definitywnie utrzymując stan zawiniętej instancji. Istnieją jako sposób na „przechwytywanie” połączeń do członków.
Luke Puplett
3

Klasa opakowania jest klasą używaną do zawijania innej klasy w celu dodania warstwy pośredniej i abstrakcji między klientem a oryginalną klasą, która jest pakowana.

Andrew Hare
źródło
3

Klasa opakowania jest opakowaniem wokół pierwotnego typu danych. Reprezentuje prymitywne typy danych w odpowiadających im instancjach klas, np. Logiczny typ danych może być reprezentowany jako instancja klasy Boolean. Wszystkie prymitywne klasy opakowań w Javie są niezmienne, tzn. Po przypisaniu wartości do instancji klasy opakowania nie można już dalej zmieniać.

David
źródło
3

Programowanie Java zapewnia klasę opakowania dla każdego pierwotnego typu danych, w celu konwersji pierwotnych typów danych na odpowiedni obiekt klasy opakowania.

THASEEF PASHA
źródło
1

Zapewnienie dobrego samopoczucia klasy opakowania nie jest łatwym zadaniem. Zrozumienie klasy opakowania, w jaki sposób jest ona zaprojektowana przez innych, również nie jest łatwym zadaniem. Ponieważ to pomysł, a nie kod. Tylko wtedy, gdy rozumiesz pomysł, możesz zrozumieć opakowanie.

Tony
źródło
0

Klasy opakowujące powstały, aby zaspokoić podstawową potrzebę programistów - tj. Używać prymitywnych wartości wszędzie tam, gdzie dozwolone są tylko obiekty. Jak sugeruje ich nazwa, klasy opakowań opakowują pierwotną wartość i przechowują wartość w obiekcie. Tak więc wszystkie te miejsca, w których prymitywy nie były dozwolone - takie jak generyczne, klucze skrótów, Arraylists itp. - programiści mają teraz możliwość podania tych prymitywnych wartości jako odpowiadających im typów opakowań.

Ponadto te typy opakowań mają wiele metod użyteczności do konwersji z typu pierwotnego na odpowiednie typy opakowań i wstecz, a także z ciągów znaków na typy opakowań i wstecz.

Na moim blogu napisałem szczegółowy artykuł o klasach opakowań, który szczegółowo wyjaśnia pojęcie typów opakowań - http://www.javabrahman.com/corejava/java-wrapper-classes-tutorial-with-examples/ (Disclosure - Ten blog jest własnością mnie)

Dhruv Rai Puri
źródło
0

Obecnie korzystam z klasy otoki dla mojego projektu i głównych korzyści, jakie otrzymuję (tylko jedna korzyść, aby poszerzyć wyjaśnienie tematu):

Obsługa wyjątków: Moja główna klasa, którą otacza inna klasa, ma metody, które zgłaszają wyjątki, jeśli takie występują, więc utworzyłem klasę opakowania, która obsługuje wyjątki i rejestruje je natychmiast. Zatem w moim głównym zakresie nie ma obsługi wyjątków. Po prostu wywołuję metodę i coś robię.

Łatwe użytkowanie: Mogę łatwo zainicjować obiekt. Zwykle faza inicjująca składa się z wielu kroków.

Czytelność kodu: gdy inny programista otworzy mój kod, kod będzie wydawał się bardzo przejrzysty i łatwy w obsłudze.

Ukrywanie szczegółów: Jeśli generujesz klasę, której będzie używał inny programista, możesz zawinąć szczegóły, takie jak „obsługa błędów, obsługa wyjątków, rejestrowanie komunikatów itp.”, Aby programista nie musiał obsługiwać chaos, po prostu używa metod.

Bahadir Tasdemir
źródło
0

Klasa otoki jest klasą, która służy wyłącznie do trzymania czegoś i dodawania do niego pewnej funkcjonalności. W Javie, ponieważ prymitywy (takie jak ints, zmiennoprzecinkowe, znaki ...) nie są obiektami, więc jeśli chcesz traktować je jak jeden, musisz użyć klasy opakowania. Załóżmy, że chcesz utworzyć wektor liczb całkowitych, problem polega na tym, że wektor zawiera obiekty, a nie prymitywy. Więc co zrobisz, umieść wszystkie liczby całkowite w opakowaniu liczb całkowitych i użyj tego. Przykład:

int number = 5;
Integer numberWrapped = new Integer(number);
//now you have the int in an object.
//and this is how to access the int value that is being wrapped.
int again = numberWrapped.intValue();
Reza Baradaran Gazorisangi
źródło
Jest to znane jako boksowanie, a nie zawijanie.
cyborg
-8

wrapper to klasa używana do komunikacji między dwiema różnymi aplikacjami między różnymi platformami

laxminarayan
źródło
Myślę, że możesz go użyć do czegoś więcej niż tylko jednego przypadku
Flexo
1
Rzeczywiście, jest to tylko jeden mały przypadek użycia.
praseodym
Myślę, że taka jest definicja usług internetowych
Bahadir Tasdemir