คลาส wrapper คืออะไร?
คลาสดังกล่าวมีประโยชน์อย่างไร
คลาส wrapper คืออะไร?
คลาสดังกล่าวมีประโยชน์อย่างไร
คำตอบ:
โดยทั่วไปคลาส wrapper เป็นคลาสที่ "wraps" หรือ "encapsulate" การทำงานของคลาสหรือส่วนประกอบอื่น สิ่งเหล่านี้มีประโยชน์โดยการกำหนดระดับของนามธรรมจากการใช้คลาสหรือส่วนประกอบพื้นฐาน ตัวอย่างเช่นคลาส wrapper ที่ล้อมรอบคอมโพเนนต์ COM สามารถจัดการกระบวนการเรียกคอมโพเนนต์ COM โดยไม่รบกวนรหัสการโทรด้วย พวกเขายังสามารถทำให้การใช้วัตถุต้นแบบง่ายขึ้นโดยการลดจำนวนจุดเชื่อมต่อที่เกี่ยวข้อง บ่อยครั้งทำให้การใช้ส่วนประกอบพื้นฐานมีความปลอดภัยมากขึ้น
ดูเหมือนว่า: คลาสที่ "ห่อ" ฟังก์ชันการทำงานของคลาสอื่นหรือ API ใน API ที่เรียบง่ายหรือแตกต่างกันเพียง API
คลาส 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 ;
แม้ว่าค่าสองเท่าจะถูกแปลงอย่างชัดเจนเป็นค่าจำนวนเต็มหรือที่เรียกว่าการดาวน์สตรีม
คลาส wrapper ไม่จำเป็นต้องล้อมคลาสอื่น มันอาจจะเป็นฟังก์ชั่นการตัดคลาส API ในเช่นไฟล์ dll
ยกตัวอย่างเช่นมันอาจจะมีประโยชน์มากในการสร้างชั้น dll เสื้อคลุมซึ่งจะดูแลทุกการเริ่มต้น dll GetProcAddress()
และการทำความสะอาดและสร้างวิธีการเรียนที่ชี้ฟังก์ชั่นที่สร้างจากห่อเช่น
ไชโย!
คลาส wrapper เป็นคลาสที่ "ล้อมรอบ" อย่างอื่นเหมือนกับชื่อของมัน
คำนิยามที่เป็นทางการมากขึ้นของมันจะเป็นระดับที่ดำเนินการแบบอะแดปเตอร์ สิ่งนี้ช่วยให้คุณสามารถปรับเปลี่ยน APIs หนึ่งชุดในรูปแบบที่ใช้งานได้และอ่านได้มากขึ้น ตัวอย่างเช่นใน C # หากคุณต้องการใช้ Windows API ดั้งเดิมมันช่วยในการห่อไว้ในคลาสที่สอดคล้องกับแนวทางการออกแบบ. NET
มีรูปแบบการออกแบบหลายอย่างที่สามารถเรียกว่าคลาส wrapper
ดูคำตอบของฉันที่ " รูปแบบพร็อกซีมัณฑนากรอะแดปเตอร์และบริดจ์แตกต่างกันอย่างไร "
นอกจากนี้ยังอาจมีประโยชน์ที่จะต้องทราบด้วยว่าในสภาพแวดล้อมบางอย่างคลาสของ wrapper อาจจะถูกแทนที่ด้วยแง่มุมต่าง ๆ
แก้ไข:
โดยทั่วไป wrapper จะขยายในสิ่งที่ wrappee ทำโดยไม่ต้องกังวลเกี่ยวกับการใช้งาน wrappee ไม่เช่นนั้นจะไม่มีประเด็นของการห่อหุ้มเมื่อเทียบกับการขยายคลาสที่ล้อมรอบ ตัวอย่างทั่วไปคือการเพิ่มข้อมูลเวลาหรือฟังก์ชั่นการบันทึกรอบอินเทอร์เฟซบริการอื่น ๆ ซึ่งตรงข้ามกับการเพิ่มเข้าไปในทุกการใช้งานของอินเทอร์เฟซนั้น
สิ่งนี้กลายเป็นตัวอย่างทั่วไปสำหรับการเขียนโปรแกรม Aspect แทนที่จะทำผ่านฟังก์ชั่นอินเทอร์เฟซโดยฟังก์ชั่นและเพิ่มการบันทึก boilerplate ในการเขียนโปรแกรมด้านคุณกำหนด pointcut ซึ่งเป็นชนิดของการแสดงออกปกติสำหรับวิธีการและจากนั้นประกาศวิธีการที่คุณต้องการจะดำเนินการก่อนหลัง Pointcut มันอาจยุติธรรมที่จะกล่าวว่าการเขียนโปรแกรมด้านเป็นชนิดของการใช้รูปแบบการตกแต่งซึ่งชั้นเรียนเสื้อคลุมสามารถใช้สำหรับ แต่เทคโนโลยีทั้งสองมีการใช้งานอื่น ๆ
คลาส Wrapper เป็นคลาสที่ล้อมคลาสอีกคลาสหนึ่งและให้สิ่งที่เป็นนามธรรมระหว่างไคลเอนต์และคลาสดั้งเดิมที่ถูกล้อมรอบ
คลาส wrapper มักเป็นคลาสที่มีวัตถุเป็นทรัพย์สินส่วนตัว wrapper ใช้ API ของอ็อบเจกต์ส่วนตัวและสามารถส่งผ่านเป็นอาร์กิวเมนต์ที่จะให้อ็อบเจกต์ส่วนตัว
สมมติว่าคุณมีคอลเล็กชันและคุณต้องการใช้การแปลบางอย่างเมื่อมีการเพิ่มออบเจ็กต์ลงไป - คุณเขียนคลาส wrapper ที่มีเมธอดของคอลเลกชันทั้งหมด เมื่อเพิ่ม () ถูกเรียก wrapper แปลอาร์กิวเมนต์แทนที่จะส่งไปยังคอลเลกชันส่วนตัว
สามารถใช้ wrapper ได้ทุกที่ที่ใช้คอลเลกชันและวัตถุส่วนตัวยังสามารถมีวัตถุอื่น ๆ ที่อ้างถึงและอ่านมันได้
คลาส wrapper เป็นคลาสที่ใช้เพื่อล้อมคลาสอื่นเพื่อเพิ่มเลเยอร์ของการอ้อมและการเลินเล่อระหว่างไคลเอนต์และคลาสดั้งเดิมที่ถูกล้อมรอบ
คลาส Wrapper เป็น wrapper รอบชนิดข้อมูลดั้งเดิม เพราะมันหมายถึงชนิดข้อมูลดั้งเดิมในอินสแตนซ์ของคลาสที่สอดคล้องกันเช่นชนิดข้อมูลบูลีนสามารถแสดงเป็นอินสแตนซ์คลาสบูลีน คลาสของ wrapper ดั้งเดิมทั้งหมดใน Java นั้นไม่เปลี่ยนรูปนั่นคือเมื่อกำหนดค่าให้กับอินสแตนซ์คลาสของ wrapper แล้วจะไม่สามารถเปลี่ยนแปลงได้อีก
การเขียนโปรแกรม Java ให้คลาส wrapper สำหรับแต่ละชนิดข้อมูลดั้งเดิมเพื่อแปลงชนิดข้อมูลดั้งเดิมให้สอดคล้องกับวัตถุของคลาส wrapper
การทำให้คลาส wrapper อยู่ดีขึ้นนั้นไม่ใช่เรื่องง่าย การทำความเข้าใจกับคลาส wrapper วิธีการที่มันถูกออกแบบโดยคนอื่นนั้นไม่ใช่เรื่องง่าย เพราะมันเป็นความคิดไม่ใช่รหัส เมื่อคุณเข้าใจความคิดคุณสามารถเข้าใจเสื้อคลุม
คลาสแรปเปอร์มาเพื่อดำรงอยู่เพื่อตอบสนองความต้องการขั้นพื้นฐานของโปรแกรมเมอร์ - เช่นการใช้ค่าดั้งเดิมที่ใดก็ตามที่อนุญาตให้มีเพียง Objects เป็นชื่อของพวกเขาแนะนำคลาส wrapper ล้อมรอบค่าดั้งเดิมและเก็บค่าในวัตถุ ดังนั้นสถานที่เหล่านั้นทั้งหมดที่ไม่อนุญาตให้ใช้แบบดั้งเดิม - เช่น generics, hashmap-keys, Arraylists เป็นต้น - โปรแกรมเมอร์มีตัวเลือกในการให้ค่าดั้งเดิมเหล่านี้เป็นชนิด wrapper ที่สอดคล้องกัน
นอกจากนี้ประเภท wrapper เหล่านี้ยังมีวิธีการอรรถประโยชน์หลายประการสำหรับการแปลงจากชนิดดั้งเดิมไปเป็นชนิด wrapper และด้านหลังที่สอดคล้องกันและจาก Strings เป็นชนิด wrapper และย้อนกลับ
ฉันได้เขียนบทความโดยละเอียดเกี่ยวกับคลาสของ wrapper ในบล็อกซึ่งอธิบายแนวคิดของประเภทของ wrapper ในเชิงลึก - http://www.javabrahman.com/corejava/java-wrapper-classes-tutorial-with-examples/ (การเปิดเผย - บล็อกนี้เป็นของฉัน)
ขณะนี้ฉันใช้คลาส wrapper สำหรับโครงการของฉันและประโยชน์หลัก ๆ ที่ฉันได้รับ (เพียงประโยชน์เดียวเพื่อขยายคำอธิบายหัวข้อ):
การจัดการข้อยกเว้น: คลาสหลักของฉันที่คลาสอื่นล้อมมีวิธีการที่จะโยนข้อยกเว้นหากเกิดขึ้นดังนั้นฉันจึงสร้างคลาส wrapper ที่จัดการข้อยกเว้นและบันทึกพวกเขาทันที ดังนั้นในขอบเขตหลักของฉันไม่มีการจัดการข้อยกเว้น ฉันเพิ่งเรียกวิธีการและทำบางสิ่งบางอย่าง
การใช้งานง่าย: ฉันสามารถเริ่มต้นวัตถุได้อย่างง่ายดาย โดยปกติแล้วขั้นตอนการเริ่มต้นจะถูกสร้างขึ้นหลายขั้นตอน
ความสามารถในการอ่านรหัส: เมื่อโปรแกรมเมอร์คนอื่นเปิดรหัสของฉันรหัสจะดูชัดเจนและจัดการได้ง่าย
การซ่อนรายละเอียด: หากคุณกำลังสร้างคลาสที่โปรแกรมเมอร์ตัวอื่นกำลังจะใช้งานคุณสามารถใส่รายละเอียดเช่น "การจัดการข้อผิดพลาดการจัดการข้อยกเว้นการบันทึกข้อความและอื่น ๆ ... " เพื่อไม่ให้โปรแกรมเมอร์ต้องจัดการ ความสับสนวุ่นวายเพียงแค่ใช้วิธีการ
คลาส 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();
wrapper เป็นคลาสที่ใช้ในการสื่อสารระหว่างสองแอพพลิเคชั่นที่แตกต่างกันระหว่างแพลตฟอร์มที่แตกต่างกัน