คลาส wrapper คืออะไร?


คำตอบ:


171

โดยทั่วไปคลาส wrapper เป็นคลาสที่ "wraps" หรือ "encapsulate" การทำงานของคลาสหรือส่วนประกอบอื่น สิ่งเหล่านี้มีประโยชน์โดยการกำหนดระดับของนามธรรมจากการใช้คลาสหรือส่วนประกอบพื้นฐาน ตัวอย่างเช่นคลาส wrapper ที่ล้อมรอบคอมโพเนนต์ COM สามารถจัดการกระบวนการเรียกคอมโพเนนต์ COM โดยไม่รบกวนรหัสการโทรด้วย พวกเขายังสามารถทำให้การใช้วัตถุต้นแบบง่ายขึ้นโดยการลดจำนวนจุดเชื่อมต่อที่เกี่ยวข้อง บ่อยครั้งทำให้การใช้ส่วนประกอบพื้นฐานมีความปลอดภัยมากขึ้น


15
คลาส wrapper (เป็นอะแด็ปเตอร์) ถูกใช้เมื่อ wrapper ต้องเคารพอินเตอร์เฟสเฉพาะและต้องสนับสนุนพฤติกรรมแบบ polymorphic ในทางกลับกันอาคารจะใช้เมื่อต้องการให้อินเทอร์เฟซที่ง่ายขึ้นหรือง่ายขึ้นในการทำงาน
Yadu

3
ในบทความนี้จะเสนอว่าเสื้อคลุมจะเป็นประโยชน์สำหรับการสร้างพร็อกซี่อย่างเคร่งครัดที่กำหนดไว้สำหรับการเรียนขอบล่าช้า: ฉันสามารถใช้ผูกปลาย ... นี่เป็นการใช้งานเพิ่มเติมสำหรับห่อที่นอกเหนือจากที่ Paul Sonier อธิบายไว้ข้างต้นหรือไม่?
ทอดด์

1
@NirajanSingh Wrapper นำมาใช้ใหม่สองอินเตอร์เฟสที่มีอยู่แล้วและทำงานหนึ่งกับอีกส่วนหนึ่ง ในทางตรงกันข้ามซุ้มสร้างอินเตอร์เฟซใหม่
Alireza

67

ดูเหมือนว่า: คลาสที่ "ห่อ" ฟังก์ชันการทำงานของคลาสอื่นหรือ API ใน API ที่เรียบง่ายหรือแตกต่างกันเพียง API

ดู: รูปแบบอะแดปเตอร์ , รูปแบบซุ้ม


ใช่ บ่อยครั้งที่ซินนิมอรัสสำหรับรูปแบบซุ้ม ในเอกสารรหัสจำนวนมากฉันเห็นวิธี facade ชัดเจนซึ่งอธิบายว่า "วิธี Wrapper to XX :: yy" หรือ adiction เล็กน้อยเช่น "วิธี Wrapper to XX :: yy ด้วยการจัดการข้อยกเว้น"
Peter Krauss

41

คลาส Wrapper จัดเตรียมวิธีในการใช้ชนิดดั้งเดิมเป็นวัตถุ สำหรับแต่ละดั้งเดิมเรามีคลาส wrapper เช่น

int Integer
byte Byte 

จำนวนเต็มและไบต์เป็นคลาส wrapper ของ int ดั้งเดิมและไบต์ มีครั้ง / ข้อ จำกัด เมื่อคุณต้องการใช้ดั้งเดิมเป็นวัตถุเพื่อให้คลาส wrapper มีกลไกที่เรียกว่าเป็น Boxing / unboxing

แนวคิดสามารถเข้าใจได้ดีจากตัวอย่างต่อไปนี้เป็น

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

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

ดังนั้นนี่คือวิธีที่เราสามารถใช้ประเภทคลาสของ wrapper เพื่อแปลงเป็นประเภทดั้งเดิมอื่น ๆ ได้เช่นกัน การแปลงประเภทนี้จะใช้เมื่อคุณต้องการแปลงชนิดดั้งเดิมเป็นวัตถุและใช้เพื่อรับแบบดั้งเดิมอื่น ๆ ด้วยวิธีการนี้คุณต้องเขียนโค้ดขนาดใหญ่ อย่างไรก็ตามสามารถทำได้เช่นเดียวกันด้วยเทคนิคการคัดเลือกนักแสดงอย่างง่าย ๆ

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

แม้ว่าค่าสองเท่าจะถูกแปลงอย่างชัดเจนเป็นค่าจำนวนเต็มหรือที่เรียกว่าการดาวน์สตรีม


1
คำตอบของคุณหมายถึงคลาส wrapper ใช้สำหรับวัตถุดั้งเดิมเท่านั้น
Guillaume F.

17

คลาส wrapper ไม่จำเป็นต้องล้อมคลาสอื่น มันอาจจะเป็นฟังก์ชั่นการตัดคลาส API ในเช่นไฟล์ dll

ยกตัวอย่างเช่นมันอาจจะมีประโยชน์มากในการสร้างชั้น dll เสื้อคลุมซึ่งจะดูแลทุกการเริ่มต้น dll GetProcAddress()และการทำความสะอาดและสร้างวิธีการเรียนที่ชี้ฟังก์ชั่นที่สร้างจากห่อเช่น

ไชโย!


8

คลาส wrapper เป็นคลาสที่ "ล้อมรอบ" อย่างอื่นเหมือนกับชื่อของมัน

คำนิยามที่เป็นทางการมากขึ้นของมันจะเป็นระดับที่ดำเนินการแบบอะแดปเตอร์ สิ่งนี้ช่วยให้คุณสามารถปรับเปลี่ยน APIs หนึ่งชุดในรูปแบบที่ใช้งานได้และอ่านได้มากขึ้น ตัวอย่างเช่นใน C # หากคุณต้องการใช้ Windows API ดั้งเดิมมันช่วยในการห่อไว้ในคลาสที่สอดคล้องกับแนวทางการออกแบบ. NET


2
ตามความเข้าใจของฉันรูปแบบอะแดปเตอร์ก็แตกต่างจากเสื้อคลุม: ถ้า X wraps Y แล้ว X ควรแค็ปซูรัฐของ Y แต่ไม่ได้ตัวตน ด้วยสองอินสแตนซ์ของ X ซึ่งทั้งสองห่อด้วย Y ไม่ควรมีวิธีที่จะพิสูจน์ว่าอินสแตนซ์ของ X ทั้งสองห่ออินสแตนซ์เดียวกันของ Y ในทางตรงกันข้ามวัตถุอะแดปเตอร์มักจะห่อหุ้มอัตลักษณ์ แต่ไม่ใช่สถานะ การเปลี่ยนแปลงวัตถุที่ถูกดัดแปลงจะไม่ถือว่าเป็นการเปลี่ยนแปลงตัวอะแดปเตอร์
supercat


7

นอกจากนี้ยังอาจมีประโยชน์ที่จะต้องทราบด้วยว่าในสภาพแวดล้อมบางอย่างคลาสของ wrapper อาจจะถูกแทนที่ด้วยแง่มุมต่าง ๆ

แก้ไข:

โดยทั่วไป wrapper จะขยายในสิ่งที่ wrappee ทำโดยไม่ต้องกังวลเกี่ยวกับการใช้งาน wrappee ไม่เช่นนั้นจะไม่มีประเด็นของการห่อหุ้มเมื่อเทียบกับการขยายคลาสที่ล้อมรอบ ตัวอย่างทั่วไปคือการเพิ่มข้อมูลเวลาหรือฟังก์ชั่นการบันทึกรอบอินเทอร์เฟซบริการอื่น ๆ ซึ่งตรงข้ามกับการเพิ่มเข้าไปในทุกการใช้งานของอินเทอร์เฟซนั้น

สิ่งนี้กลายเป็นตัวอย่างทั่วไปสำหรับการเขียนโปรแกรม Aspect แทนที่จะทำผ่านฟังก์ชั่นอินเทอร์เฟซโดยฟังก์ชั่นและเพิ่มการบันทึก boilerplate ในการเขียนโปรแกรมด้านคุณกำหนด pointcut ซึ่งเป็นชนิดของการแสดงออกปกติสำหรับวิธีการและจากนั้นประกาศวิธีการที่คุณต้องการจะดำเนินการก่อนหลัง Pointcut มันอาจยุติธรรมที่จะกล่าวว่าการเขียนโปรแกรมด้านเป็นชนิดของการใช้รูปแบบการตกแต่งซึ่งชั้นเรียนเสื้อคลุมสามารถใช้สำหรับ แต่เทคโนโลยีทั้งสองมีการใช้งานอื่น ๆ


7

คลาส Wrapper เป็นคลาสที่ล้อมคลาสอีกคลาสหนึ่งและให้สิ่งที่เป็นนามธรรมระหว่างไคลเอนต์และคลาสดั้งเดิมที่ถูกล้อมรอบ


5

คลาส wrapper มักเป็นคลาสที่มีวัตถุเป็นทรัพย์สินส่วนตัว wrapper ใช้ API ของอ็อบเจกต์ส่วนตัวและสามารถส่งผ่านเป็นอาร์กิวเมนต์ที่จะให้อ็อบเจกต์ส่วนตัว

สมมติว่าคุณมีคอลเล็กชันและคุณต้องการใช้การแปลบางอย่างเมื่อมีการเพิ่มออบเจ็กต์ลงไป - คุณเขียนคลาส wrapper ที่มีเมธอดของคอลเลกชันทั้งหมด เมื่อเพิ่ม () ถูกเรียก wrapper แปลอาร์กิวเมนต์แทนที่จะส่งไปยังคอลเลกชันส่วนตัว

สามารถใช้ wrapper ได้ทุกที่ที่ใช้คอลเลกชันและวัตถุส่วนตัวยังสามารถมีวัตถุอื่น ๆ ที่อ้างถึงและอ่านมันได้


1
เห็นด้วยมุมมองส่วนตัวของฉันเกี่ยวกับเครื่องห่อหุ้มคือพวกเขามีลักษณะและความรู้สึกเหมือนแบบดั้งเดิมและอาจใช้อินเทอร์เฟซเดียวกันถือสถานะของอินสแตนซ์ที่ถูกห่อไว้ พวกเขามีอยู่เป็นวิธีการ "สกัดกั้น" การโทรหาสมาชิก
Luke Puplett

3

คลาส wrapper เป็นคลาสที่ใช้เพื่อล้อมคลาสอื่นเพื่อเพิ่มเลเยอร์ของการอ้อมและการเลินเล่อระหว่างไคลเอนต์และคลาสดั้งเดิมที่ถูกล้อมรอบ


3

คลาส Wrapper เป็น wrapper รอบชนิดข้อมูลดั้งเดิม เพราะมันหมายถึงชนิดข้อมูลดั้งเดิมในอินสแตนซ์ของคลาสที่สอดคล้องกันเช่นชนิดข้อมูลบูลีนสามารถแสดงเป็นอินสแตนซ์คลาสบูลีน คลาสของ wrapper ดั้งเดิมทั้งหมดใน Java นั้นไม่เปลี่ยนรูปนั่นคือเมื่อกำหนดค่าให้กับอินสแตนซ์คลาสของ wrapper แล้วจะไม่สามารถเปลี่ยนแปลงได้อีก


3

การเขียนโปรแกรม Java ให้คลาส wrapper สำหรับแต่ละชนิดข้อมูลดั้งเดิมเพื่อแปลงชนิดข้อมูลดั้งเดิมให้สอดคล้องกับวัตถุของคลาส wrapper


1

การทำให้คลาส wrapper อยู่ดีขึ้นนั้นไม่ใช่เรื่องง่าย การทำความเข้าใจกับคลาส wrapper วิธีการที่มันถูกออกแบบโดยคนอื่นนั้นไม่ใช่เรื่องง่าย เพราะมันเป็นความคิดไม่ใช่รหัส เมื่อคุณเข้าใจความคิดคุณสามารถเข้าใจเสื้อคลุม


0

คลาสแรปเปอร์มาเพื่อดำรงอยู่เพื่อตอบสนองความต้องการขั้นพื้นฐานของโปรแกรมเมอร์ - เช่นการใช้ค่าดั้งเดิมที่ใดก็ตามที่อนุญาตให้มีเพียง Objects เป็นชื่อของพวกเขาแนะนำคลาส wrapper ล้อมรอบค่าดั้งเดิมและเก็บค่าในวัตถุ ดังนั้นสถานที่เหล่านั้นทั้งหมดที่ไม่อนุญาตให้ใช้แบบดั้งเดิม - เช่น generics, hashmap-keys, Arraylists เป็นต้น - โปรแกรมเมอร์มีตัวเลือกในการให้ค่าดั้งเดิมเหล่านี้เป็นชนิด wrapper ที่สอดคล้องกัน

นอกจากนี้ประเภท wrapper เหล่านี้ยังมีวิธีการอรรถประโยชน์หลายประการสำหรับการแปลงจากชนิดดั้งเดิมไปเป็นชนิด wrapper และด้านหลังที่สอดคล้องกันและจาก Strings เป็นชนิด wrapper และย้อนกลับ

ฉันได้เขียนบทความโดยละเอียดเกี่ยวกับคลาสของ wrapper ในบล็อกซึ่งอธิบายแนวคิดของประเภทของ wrapper ในเชิงลึก - http://www.javabrahman.com/corejava/java-wrapper-classes-tutorial-with-examples/ (การเปิดเผย - บล็อกนี้เป็นของฉัน)


0

ขณะนี้ฉันใช้คลาส wrapper สำหรับโครงการของฉันและประโยชน์หลัก ๆ ที่ฉันได้รับ (เพียงประโยชน์เดียวเพื่อขยายคำอธิบายหัวข้อ):

การจัดการข้อยกเว้น: คลาสหลักของฉันที่คลาสอื่นล้อมมีวิธีการที่จะโยนข้อยกเว้นหากเกิดขึ้นดังนั้นฉันจึงสร้างคลาส wrapper ที่จัดการข้อยกเว้นและบันทึกพวกเขาทันที ดังนั้นในขอบเขตหลักของฉันไม่มีการจัดการข้อยกเว้น ฉันเพิ่งเรียกวิธีการและทำบางสิ่งบางอย่าง

การใช้งานง่าย: ฉันสามารถเริ่มต้นวัตถุได้อย่างง่ายดาย โดยปกติแล้วขั้นตอนการเริ่มต้นจะถูกสร้างขึ้นหลายขั้นตอน

ความสามารถในการอ่านรหัส: เมื่อโปรแกรมเมอร์คนอื่นเปิดรหัสของฉันรหัสจะดูชัดเจนและจัดการได้ง่าย

การซ่อนรายละเอียด: หากคุณกำลังสร้างคลาสที่โปรแกรมเมอร์ตัวอื่นกำลังจะใช้งานคุณสามารถใส่รายละเอียดเช่น "การจัดการข้อผิดพลาดการจัดการข้อยกเว้นการบันทึกข้อความและอื่น ๆ ... " เพื่อไม่ให้โปรแกรมเมอร์ต้องจัดการ ความสับสนวุ่นวายเพียงแค่ใช้วิธีการ


0

คลาส wrapper เป็นคลาสที่ทำหน้าที่จุดประสงค์เดียวในการเก็บบางสิ่งบางอย่างและเพิ่มฟังก์ชันการทำงานบางอย่างลงไป ใน Java ตั้งแต่ดั้งเดิม (เช่น ints, ลอย, ตัวอักษร ... ) ไม่ใช่วัตถุดังนั้นหากคุณต้องการที่จะรักษาพวกเขาเหมือนหนึ่งจากนั้นคุณต้องใช้คลาส wrapper สมมติว่าคุณต้องการสร้างเวกเตอร์ของ ints ปัญหาคือ Vector จะเก็บเฉพาะออบเจ็กต์ที่ไม่เป็นพื้นฐาน ดังนั้นสิ่งที่คุณจะทำคือใส่ ints ทั้งหมดใน wrapper จำนวนเต็มและใช้สิ่งนั้น ตัวอย่าง:

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();

เรื่องนี้เป็นที่รู้จักกันในชื่อมวยโบราณ
cyborg

-8

wrapper เป็นคลาสที่ใช้ในการสื่อสารระหว่างสองแอพพลิเคชั่นที่แตกต่างกันระหว่างแพลตฟอร์มที่แตกต่างกัน


ฉันคิดว่าคุณสามารถใช้มันได้มากกว่าหนึ่งกรณี
Flexo

1
อันที่จริงนี่เป็นเพียงกรณีใช้งานขนาดเล็กเพียงหนึ่งเดียว
praseodym

ฉันคิดว่านี่เป็นคำจำกัดความของบริการเว็บ
Bahadir Tasdemir
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.