1. น้ำตาลสังเคราะห์

โปรแกรมเมอร์ชื่นชอบเมื่อสามารถเขียนโค้ดหรือลอจิกที่ซับซ้อนได้ในสองสามบรรทัด ทำให้โค้ดมีขนาดกะทัดรัดและสามารถอ่านได้ และบางครั้งผู้สร้างภาษาโปรแกรมก็ช่วยในเรื่องนี้

คุณลักษณะภาษาลื่นไหลที่ช่วยให้คุณสามารถใช้ทางลัด (เขียนโค้ดน้อยลง) เรียกว่าsyntactic sugar แต่ตามจริงแล้วมีน้อยมากใน Java

ผู้สร้าง Java ทำทุกอย่างที่ทำได้เพื่อกำจัดความซ้ำซ้อนใน Java ถ้า C++ ให้คุณทำได้ 20 วิธี Java ก็ให้คุณทำได้วิธีเดียว

แต่โปรแกรมเมอร์ Java และผู้สร้าง Java ไม่ชอบการขาดอิสระ และบางครั้งน้ำตาลก็ทำให้ชีวิตคนธรรมดาเช่นคุณและฉันง่ายขึ้น

ยังไงก็ตาม คุณเคยพบคำเสริมประโยคมาบ้างแล้ว: autoboxingและunboxing ลองเปรียบเทียบ:

รหัสยาว รหัสกะทัดรัด
Integer a = new Integer(5);
int b = a.intValue();
Integer a = 5;
int b = a;
int b = 5;
Integer c = new Integer(b);
int b = 5;
Integer c = b;
Integer a = new Integer(1);
int b = 1;
if (a.intValue() == b)
{
   ...
}
Integer a = 1;
int b = 1;
if (a == b)
{
   ...
}

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


2. การอนุมานประเภทของตัวแปร: varคำหลัก

ใน Java 11 คอมไพเลอร์จะฉลาดยิ่งขึ้น และตอนนี้สามารถกำหนดประเภทของตัวแปรที่ประกาศตามประเภทของค่าที่กำหนดให้ ในรหัสดูเหมือนว่า:

var name = value;

โดยที่nameชื่อของตัวแปรใหม่valueคือค่าเริ่มต้น และvarเป็นคีย์เวิร์ดที่ใช้ในการประกาศตัวแปร ประเภทของ ตัวแปร ชื่อจะเหมือนกับประเภทของค่าที่กำหนด

ตัวอย่าง:

วิธีที่เราเห็นรหัส สิ่งที่คอมไพเลอร์เห็น
var i = 1;
int i = 1;
var s = "Hello";
String s = "Hello";
var console = new Scanner(System.in);
Scanner console = new Scanner(System.in);
var list = new ArrayList<String>();
ArrayList<String> list = new ArrayList<String>();
var data = new int[]{1, 2, 3};
int[] data = new int[]{1, 2, 3};

ตัวคอมไพเลอร์จะกำหนดหรืออนุมานประเภทของตัวแปรตามค่าที่กำหนดให้

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

มีความจริงเล็กน้อยเกี่ยวกับเรื่องนี้ ดังนั้นจึงเป็นการดีที่สุดที่จะใช้varเมื่อเพิ่มความสามารถในการอ่านโค้ด ตัวอย่างเช่นในสองกรณี:

กรณีที่ 1: ดูค่าที่กำหนดให้กับตัวแปร ชนิดของตัวแปรจะชัดเจนทันที

รหัส คำอธิบาย
var stream = url.getInputStream();
ตัวแปรคือInputStream
var name = person.getFullName();
ตัวแปรคือ aString

ในกรณีเหล่านี้ คุณไม่varควรใช้ ประเภทของตัวแปรคืออะไร?

รหัส คำอธิบาย
var result = task.execute();
เป็นการยากที่จะกำหนดประเภทของตัวแปร
var status = person.getStatus();
เป็นการยากที่จะกำหนดประเภทของตัวแปร

กรณีที่ 2: ประเภทของตัวแปรไม่สำคัญต่อการทำความเข้าใจโค้ด

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

รหัสยาว รหัสกะทัดรัด
var data = stream.getMetaData();
storage.save(data)
เราได้รับข้อมูลเมตาจากstreamสตรีมและบันทึกไว้ในstorageพื้นที่เก็บข้อมูล ประเภทdataเฉพาะของตัวแปรไม่สำคัญ

หมายถึงสีทอง

ตอนนี้ฉันจะให้สามวิธีในการเขียนรหัสเดียวกัน การใช้varจะเป็นตัวเลือกที่ดีที่สุด

รหัส บันทึก
dest.writeHeaderInfo(src.getFileMetaInfo());
กะทัดรัดเกินไป
var headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
ถูกต้อง
FileMetaInfo headerInfo = src.getFileMetaInfo();
dest.writeHeaderInfo(headerInfo);
รายละเอียดมากเกินไป

การย้ายจากเวอร์ชันที่มี 1 บรรทัดเป็นเวอร์ชันที่มี 2 บรรทัด เราทำให้โค้ดอ่านง่ายขึ้นเล็กน้อยโดยใช้ชื่อตัวแปร ( headerInfo) ตอนนี้เป็นที่ชัดเจนว่าเมธอดไม่ส่งคืนข้อมูลเมตาเท่านั้น แต่ยังรวมถึงข้อมูลส่วนหัวด้วย

รุ่นที่สามมีรายละเอียดมากเกินไป ความจริงที่ว่าheaderInfoa นั้นFileMetaInfoค่อนข้างชัดเจนจากgetFileMetaInfo()วิธีการ จุดประสงค์ของข้อมูลเมตานั้นน่าสนใจกว่ามาก



3. การละเว้นประเภทด้วยตัวดำเนินการเพชร:<>

แม้กระทั่งก่อนที่varโอเปอเรเตอร์จะปรากฏตัว ก็มีความพยายามที่จะสอนคอมไพเลอร์ถึงวิธีการอนุมานประเภทคอลเลกชัน คุณจะยอมรับว่าสัญลักษณ์นี้ดูซ้ำซ้อนเล็กน้อย:

ArrayList<String> list = new ArrayList<String>();

ตั้งแต่เวอร์ชันที่เจ็ดของ Java เมื่อเขียนประเภทคอลเลกชัน คุณสามารถละเว้นประเภทขององค์ประกอบคอลเลกชันได้หากมีการระบุเมื่อประกาศตัวแปร กล่าวอีกนัยหนึ่ง โค้ดด้านบนสามารถเขียนในรูปแบบย่อเล็กน้อย:

ArrayList<String> list = new ArrayList<>();

อย่างที่คุณเห็น คุณไม่จำเป็นต้องเขียน String เป็นครั้งที่สองอีกต่อไป ไม่เจ๋งเท่าตัวดำเนินการ var แต่ดูเหมือนว่าจะมีความคืบหน้าในเวลานั้น

วงเล็บมุมว่างในประเภทคอลเลกชันเรียกว่าตัวดำเนินการเพชรเนื่องจากวงเล็บมุมสองอันมีลักษณะคล้ายเพชร

ไม่พึงปรารถนาที่จะใช้varคำหลักและตัวดำเนินการรูปสี่เหลี่ยมขนมเปียกปูน ในเวลาเดียวกัน :

var list = new ArrayList<>();

ไม่มีข้อมูลเกี่ยวกับประเภทขององค์ประกอบที่จัดเก็บไว้ในคอลเล็กชัน และประเภทคอลเล็กชันจะเป็นArrayList < Object >



4. วงเล็บปีกกาคู่

จำการเริ่มต้นอาร์เรย์อย่างรวดเร็วได้หรือไม่

เราเพิ่งระบุค่าในวงเล็บปีกกาดังนี้:

ตัวอย่าง
int[] data = new int[] {1, 2, 3, 4, 5, 6, 7};
int[] data = {1, 2, 3, 4, 5, 6, 7};

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

ผู้สร้างของ Java มีความคิดสร้างสรรค์เพียงพอสำหรับคอลเลกชันเช่นกัน ทำให้พวกเขาสามารถใช้กลอุบายด้วยปีกกาคู่

ด้วยน้ำตาล ปราศจากน้ำตาล
var list = new ArrayList<String>()
{{
   add("Hello");
   add("How's");
   add("Life?");
}};
var list = new ArrayList<String>();

list.add("Hello");
list.add("How's");
list.add("Life?");

หากคอมไพลเลอร์พบโค้ดตามตัวอย่างทางด้านซ้าย ก็จะแปลงเป็นโค้ดทางด้านขวา

รหัสไม่ได้กระชับขึ้นมากนัก การประหยัดที่นี่ค่อนข้างไม่มีนัยสำคัญ: คุณไม่จำเป็นต้องเขียนlistทุกครั้ง สิ่งนี้มีประโยชน์หากชื่อตัวแปรยาวมาก

แต่ถ้าคุณเจอโค้ดแบบนี้ในโครงการ ไม่ต้องแปลกใจ 🙂