คลาส Wrapper
แนะนำใหม่| English | ความหมาย |
|---|---|
| wrapper class/ˈræpə klæs/ | คลาสห่อหุ้ม |
| autoboxing/ˌɔːtəʊˈbɒksɪŋ/ | การห่อหุ้มอัตโนมัติ |
| unboxing/ʌnˈbɒksɪŋ/ | การถอดหุ้มอัตโนมัติ |
การห่อหุ้ม primitive
- โครงสร้าง Java บางอย่าง (เช่น
ArrayList) เก็บ objects, ไม่ใช่ primitives - ** Wrapper class ** คือคลาสที่ห่อหุ้ม primitive ไว้เป็น object:
Integerห่อหุ้มint,Doubleห่อหุ้มdouble. Integer boxed = Integer.valueOf(5);นำint5ไปใส่ภายใน object- Wrappers ทำให้ primitive สามารถใช้งานในพื้นที่ซึ่งอนุญาตให้ใช้เฉพาะ object เท่านั้นได้
การ Autoboxing และ Unboxing ของ
- Java จะแปลงข้อมูลอัตโนมัติ — ซึ่งเรียกว่า autoboxing และ unboxing
Integer x = 5;Autoboxes5;int y = x;Unboxes它 back.- ดังนั้น
list.add(5)จึงทำงานได้แม้ว่า list จะเก็บวัตถุประเภทIntegerอยู่ก็ตาม - คุณแทบจะไม่จำเป็นต้องเขียน
Integer.valueOfด้วยตนเอง — เพราะระบบ autoboxing จะจัดการให้แทน
เหตุผลที่ ต้องใช้ ArrayList กับWRAPPER
ArrayList<Integer>เก็บวัตถุประเภทIntegerเนื่องจาก generics จำเป็นต้องใช้ reference type เท่านั้น- คุณไม่สามารถเขียน
ArrayList<int>ได้โดยตรง — เพราะ primitive ไม่ใช่ object - Autoboxing ช่วยให้คุณเพิ่มและอ่านค่า
intแบบธรรมดาได้อย่างสะดวก Double,Booleanฯลฯ มีบทบาทเหมือนกันสำหรับ primitive ของพวกมัน
เปรียบเทียบ Wrapper กับ equals
- วัตถุ
Integerสองตัวควรเปรียบเทียบกันด้วย.equals()ไม่ใช่== ==เปรียบเทียบที่การอ้างอิง (references); แต่.equals()เปรียบเทียบที่ค่าที่ถูกห่อหุ้มอยู่ข้างใน- (Java มีการ cache Integer ขนาดเล็กบางค่า ทำให้
==บางครั้ง ดูเหมือน จะทำงานได้ — อย่าพึ่งพาสิ่งนี้) - กฎเดิมที่ว่า "ให้ใช้
.equals()สำหรับการเปรียบเทียบวัตถุ" จากStringก็ยังคงใช้ได้ในกรณีนี้
Wrappers เป็น object ดังนั้นให้เปรียบเทียบค่าของพวกมันด้วย .equals() ไม่ใช่ ==. == จะทดสอบความเท่าเทียมกันของการอ้างอิง (reference identity); สำหรับวัตถุ Integer สองตัวที่มีค่าเดียวกัน มันอาจให้ผลลัพธ์เป็น false และคุณไม่สามารถใช้ primitive เพื่อ parameterize collection ได้ — มันจะเป็น ArrayList<Integer> เสมอ ไม่ใช่ ArrayList<int>. Autoboxing ช่วยเชื่อมช่องว่างนี้เพื่อให้คุณสามารถเพิ่มค่า int แบบธรรมดาได้
การใช้ Wrappers ร่วมกับ ArrayList:
ArrayList<Integer> nums = new ArrayList<Integer>();nums.add(5);— ค่าint5จะถูก autobox เป็นIntegerint first = nums.get(0);— ค่าIntegerจะถูก unbox กลับเป็นint
Wrapper class (Integer, Double, Boolean) ห่อหุ้ม primitive ไว้ใน object เพื่อให้สามารถนำไปใช้ในพื้นที่ที่ต้องการ object ได้ — เช่น ArrayList<Integer> (คุณไม่สามารถเขียน ArrayList<int> ได้โดยตรง) Autoboxing และ unboxing เปลี่ยนแปลงโดยอัตโนมัติ เมื่อเปรียบเทียบ wrapper objects ให้ใช้ .equals() ไม่ใช่ ==
Autoboxing และ unboxing
การแปลง int ↔ Integer เกิดขึ้นโดยอัตโนมัติ
คลาส Wrapper ตัวใดห่อหุ้ม int?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Integer ห่อหุ้ม int; Double ห่อหุ้ม double
ทำไม ArrayList ของ int ต้องประกาศเป็น ArrayList
Difficulty 1/5 · 100 coins + a small bonus on first completion today
คุณไม่สามารถเขียน ArrayList
สองวัตถุ Integer ควรเปรียบเทียบกันด้วย...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Wrapper เป็น objects — ใช้ .equals() เพื่อเปรียบเทียบค่า
ใน nums.add(5), int 5 ถูก autobox เป็น Integer โดยอัตโนมัติ
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Autoboxing แปลง primitive เป็นวัตถุ wrapper
คลาสที่ห่อหุ้ม primitive ไว้ภายใน object คือคลาส ___ (หนึ่งคำ)
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Integer, Double, Boolean เป็น wrapper classes