Odpowiedzi:
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.
Tak to brzmi: klasa, która „pakuje” funkcjonalność innej klasy lub interfejsu API w prostszy lub po prostu inny interfejs API.
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.
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 !
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.
Istnieje kilka wzorców projektowych, które można nazwać klasami opakowań.
Zobacz moją odpowiedź na pytanie „ Czym różnią się wzory proxy, dekoratora, adaptera i mostka? ”
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.
Klasa opakowania jest klasą, która otacza inną klasę i zapewnia abstrakcję między opakowaną klasą klienta a klasą oryginalną.
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.
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.
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ć.
Programowanie Java zapewnia klasę opakowania dla każdego pierwotnego typu danych, w celu konwersji pierwotnych typów danych na odpowiedni obiekt klasy opakowania.
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.
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)
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.
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();
wrapper to klasa używana do komunikacji między dwiema różnymi aplikacjami między różnymi platformami