รวม 24 Tricks, Tips และ Best Practices ของ Java

10-เม.ย.-20

คัมภีร์เทพ IT

Java เป็นภาษา Programming ที่ได้รับความนิยมมาอย่างยาวนาน แม้ Java จะเป็นภาษาที่มีประสิทธิภาพ แต่ก็ต้องใช้เวลาในการศึกษาเรียนรู้ บทความนี้จึงได้ รวม 24 Tricks, Tips และ Best Practices ของ Java มาให้คุณได้ลองนำไปประยุกต์ใช้เพื่อเป็นการประหยัดเวลา เพิ่มประสิทธิภาพและปรับปรุงคุณภาพ Code ให้ดีขึ้น 

Work Organization

1. Clean Code

ใน Project ขนาดใหญ่ เราไม่ควรให้ความสำคัญแค่การสร้าง Code ใหม่ แต่ควรคิดถึงการ Maintain Code ด้วย ดังนั้นจึงเป็นสิ่งสำคัญมากที่ต้องมีการจัดระเบียบ Code ให้ดีตั้งแต่เริ่มต้น เมื่อออกแบบ Application ใหม่ โปรดอย่าลืม 3 หลักการพื้นฐานของ Clean Code:

  • กฎ 10-50-500 ซึ่งคือ ในหนึ่ง Package ควรมีไม่เกิน 10 Classes, แต่ละ Method ควรมี Code ที่สั้นกว่า 50 บรรทัด และแต่ละ Class ไม่ควรมี Code เกิน 500 บรรทัด
  • SOLID Design Principles 
  • ใช้ Design Patterns

Work with Errors

2. Stack Trace

การตรวจหา Bugs อาจเป็นส่วนที่ใช้เวลานานที่สุดใน Process ของ Java Development การทำ Stack Trace จะช่วยให้คุณสามารถ Track ได้ว่าส่วนใดของ Project ที่เกิด Exception ซึ่งจะช่วยให้เราหาและวิเคราะห์ Errors ได้ง่ายขึ้น

3. NullPointer Exception

Null Pointer Exceptions เกิดขึ้นใน Java ค่อนข้างบ่อยเมื่อมีการพยายาม Call Method ของ Object ที่ไม่มีอยู่

ลองดูตัวอย่างของ Code ต่อไปนี้:

Date and Time

4. System.currentTimeMillis vs System.nanoTime

ใน Java มี 2 วิธีมาตรฐาน ในการจัดการเกี่ยวกับเวลา และมันก็มักจะไม่ชัดเจนว่า ควรจะเลือกแบบใด 

System.currentTimeMillis() Method ทำการ Return ตัวเลขที่เป็น มิลลิวินาที ซึ่งเป็นแบบนี้มาตั้งแต่ยุคของ Unix ใน Format ของ Long ส่วนความแม่นยำของมันอยู่ในช่วงตั้งแต่ 1 ถึง 15,000 วินาที ขึ้นอยู่กับ System

System.nanoTime Method มีความแม่นยำถึง 1 x 10-9 วินาที (nanosecond) และ Return ค่าปัจจุบันของ System Timer ที่แม่นยำที่สุด

ดังนั้น System.currentTimeMillis นั้นดีสำหรับการแสดงเวลาจริง ในขณะที่ System.nanoTime นั้นดีสำหรับการใช้วัดระยะเวลา

5. Validity of the Date Line

หากคุณต้องการรับ Date Object จาก String ใน Java ให้ใช้ SimpleDateFormat Class (ซึ่งอ่านเพิ่มเติมได้ในบทความนี้) ซึ่งจะช่วยให้คุณสามารถจัดการกับความซับซ้อนทั้งหมดของการ Validation และ Conversion

Strings

 6. Row Optimization

การที่เราทำการต่อ (Concatenate) String ใน Java โดยใช้เครื่องหมาย “+” (อย่างเช่น ใน For Loop) Object จะถูกสร้างขึ้นใหม่ทุกครั้งที่เราทำการสร้าง String จะนำไปสู่การใช้ Memory ที่มากขึ้น รวมทั้งเป็นการเพิ่มเวลาในการ Run ของ Program

คุณควรหลีกเลี่ยงการสร้าง Java Strings โดยใช้ Class Constructor:

7. Single and Double Quotes

คุณคิดว่าจะเกิดอะไรขึ้น จาก Code ด้านล่างนี้

ดูเหมือนว่า String ควรจะ Return คำว่า HaHa ออกมา แต่ในความเป็นจริงมันกลับกลายเป็น Ha169 แทน

เมื่อใช้ Double Quotes จะเป็นการถือว่า ตัวอักขระนั้นเป็น String แต่สำหรับ Single Quotes จะทำงานแตกต่างไป นั่นคือ มันจะแปลงตัวอักขระ (‘H’ และ ‘a') ไปเป็นค่า Integer ผ่าน Extension ของ Primitive Types ซึ่งมันจะกลายเป็น 169 นั่นเอง

Maths

8. Float vs Double

Programmers มักจะไม่สามารถเลือกความแม่นยำที่พวกเขาต้องการสำหรับตัวเลขทศนิยมได้ โดย Float ต้องการใช้เพียง 4 bytes ในขณะที่ Double จะแม่นยำขึ้นเป็น 2 เท่า ซึ่งอาจดูสิ้นเปลือง Memory ไปสักหน่อย

ในความเป็นจริง Processors ส่วนใหญ่สามารถทำงานกับ Float และ Double ได้อย่างมีประสิทธิภาพพอ ๆ กัน ดังนั้น ลองดูคำแนะนำของ Bjorn Stroustrup:

“การเลือกความแม่นยำเหมาะสมในปัญหาจริง ๆ นั้น ต้องมีความเข้าใจในลักษณะของการคำนวณของ Machine เสียก่อน หากคุณยังไม่เข้าใจ ก็ให้ปรึกษาคนที่รู้ หรือศึกษาปัญหาด้วยตนเอง หรือใช้ Double และภาวนาให้ผลออกมาดี ไม่มีอะไรผิดร้ายแรง”

9. Oddness Check

เป็นไปได้ไหม ที่จะใช้ Code ด้านล่างนี้เพื่อตรวจสอบว่าเป็นเลขคี่ หรือไม่

หวังว่าคุณจะสังเกตเห็นเคล็ดลับบางอย่าง หากเราตัดสินใจที่จะตรวจสอบเลขคี่ที่เป็นค่าลบ (เช่น -5 เป็นต้น) เศษของการหารจะไม่เท่ากับ 1 ดังนั้น เราจะใช้วิธีที่แม่นยำยิ่งขึ้น:

มันไม่เพียงแต่จะช่วยแก้ปัญหาของจำนวนที่ติดลบได้เท่านั้น แต่ยังมีประสิทธิภาพที่ดีกว่าด้วย การดำเนินการทางคณิตศาสตร์ (Arithmetic) และตรรกะ (Logic) จะทำได้รวดเร็วกว่าการใช้ คูณและหาร

10. Degree Calculation

คุณสามารถทำการยกกำลังของตัวเลขได้ 2 วิธี:
  • การคูณอย่างง่าย ๆ
  • ใช้ Math.pow(double base, double exponent) Function

โดยทั่วไปเราจะใช้ Library Function ก็ต่อเมื่อมีความจำเป็นจริง ๆ เท่านั้น เช่น ในกรณีที่เป็นเศษส่วนหรือเลขยกกำลังที่ติดลบ

การใช้วิธีการคูณอย่างง่าย ๆ ใน Java ทำงานได้อย่างมีประสิทธิภาพ 300-600 เท่า นอกจากนี้ยังสามารถ Optimize ได้อีกด้วย:

11. Jit Optimization

Java Code ถูกประมวลผลโดยใช้ JIT Compilation ก่อนอื่นมันจะถูกแปลเป็น Byte Code ที่ไม่ขึ้นอยู่กับ Platform ใด ๆ จากนั้นจะถูกแปลไปเป็น Machine Code ในขณะเดียวกันมันก็จะถูก Optimize ทุกสิ่งเท่าที่เป็นไปได้ และ Developers ก็สามารถช่วยให้ Compiler สร้าง Program ที่มีประสิทธิภาพสูงสุด

ยกตัวอย่างเช่น ลองดูการ Operation ง่าย ๆ ทั้ง 2 แบบจากด้านล่างนี้:

เรามาวัดเวลาที่ในการ Execution ของแต่ละแบบกัน:

เมื่อมีการ Run Code เหล่านี้หลาย ๆ ครั้ง เราจะเห็นดังที่อยู่ด้านล่างนี้:

เราจะเห็น Pattern ที่ชัดเจน การใช้วงเล็บในการจัดการกับตัวแปร จะช่วยทำให้การทำงานของ Program เร็วขึ้น ซึ่งมันเป็นสาเหตุของการสร้าง Byte-Code ที่มีประสิทธิภาพมากขึ้นเมื่อมีการคูณค่าที่เหมือนกัน

คุณสามารถอ่านเพิ่มเติมเกี่ยวกับการทดสอบนี้ได้ที่นี่ 

Data Structures

12. Combining Hash Tables

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

13. Array vs ArrayList

ในการเลือกใช้งาน ระหว่าง Array และ ArrayList ขึ้นอยู่กับลักษณะของ Java Task ที่คุณต้องการจะแก้ไข แนะนำให้จำ Features ต่อไปนี้ของ Types เหล่านี้:

  • Array มีขนาดที่คงที่ และ Memory จะถูก Allocate ในตอนที่มีการประกาศ ส่วนขนาดของ ArrayLists สามารถเปลี่ยนแปลงได้
  • Java Arrays จะเร็วกว่ามาก แต่ใน ArrayList จะสามารถเพิ่ม/ลบ Items ได้ง่ายกว่า
  • เมื่อทำงานกับ Array มีโอกาสที่จะเกิด Error ArrayIndexOutOfBoundsException
  • ArrayList มีเพียง 1 มิติ แต่ Java Arrays สามารถมีได้หลายมิติ

Json

14. Serialization and Deserialization

JSON เป็น Syntax ที่มีประโยชน์และสะดวกในการใช้อย่างเหลือเชื่อสำหรับการ Store และ Share ข้อมูล โดย Java เองก็มีการรองรับการใช้งานมันอย่างเต็มที่

คุณสามารถ Serialize  Data ได้ดังนี้:

จะได้ JSON String ดังนี้:

Java Deserialization จะมีลักษณะดังนี้:

JSON File ที่ใช้ในตัวอย่างนี้ (jsonDemoFile.json):

Input Output

15. FileOutputStream vs. Filewriter

การเขียน File ไปยัง Java นั้นทำได้ 2 วิธีคือ FileOutputStream และ FileWriter ส่วนการที่จะเลือกใช้วิธีไหน ก็ขึ้นอยู่กับลักษณะของ Task ที่จะทำ

FileOutputStream ถูกออกแบบมาเพื่อเขียน Raw Byte Streams ซึ่งสิ่งนี้ทำให้เป็น Solution สำหรับการทำงานกับรูปภาพ เช่น

ในขณะที่ FileWriter จะสามารถทำงานกับ Streams ของ Characters ดังนั้น หากคุณกำลังเขียน Text Files ก็ให้เลือกใช้วิธีนี้

Performance and Best Practices

16. Empty Collection Instead of Null

หาก Program ของคุณสามารถ Return Collection ที่ไม่มีค่าใด ๆ อยู่ข้างใน ก็ขอให้ตรวจสอบให้แน่ใจว่า มันเป็น Empty Collection ที่ถูก Return กลับมาและไม่ใช่ Null มันจะช่วยคุณประหยัดเวลาสำหรับการตรวจสอบ

17. Creating Objects Only When Necessary

การสร้าง Objects ถือเป็นการดำเนินการที่ต้องใช้ความพยายามและเวลามากที่สุดอย่างหนึ่งใน Java สำหรับ Best Practice ก็คือ ให้สร้างมันเมื่อจำเป็นจริง ๆ เท่านั้น

18. Deadlocks

Mutual Blocking ของ Threads สามารถเกิดขึ้นได้จากหลายสาเหตุ และมันก็เป็นการยากที่จะป้องกันเพื่อไม่ให้เกิดขึ้นใน Java 8 โดยส่วนใหญ่มักเกิดขึ้นเมื่อ Synchronized Object หนึ่งรอ Resource ที่ถูก Lock โดย Synchronized Object ตัวอื่น ๆ

นี่คือตัวอย่างของ Thread Deadlock นี้:

ผลลัพธ์ของ Program นี้:

สามารถหลีกเลี่ยง Deadlocks ได้ด้วยเปลี่ยนลำดับใน Threads ที่ถูกเรียก:

สรุป:

19. Memory Reservation

Java Applications บางตัวนั้นใช้ Resource มากซึ่งทำให้ช้า เพื่อเพิ่มประสิทธิภาพให้ดีขึ้น คุณสามารถ Allocate RAM ให้กับ Java Machine ของคุณให้มากขึ้นได้

  • Xms – Minimum Pool ของ Memory Allocation
  • Xmx – Maximum Memory Allocation Pool
  • XX: PermSize – ขนาดเริ่มต้นที่จะถูก Allocate เมื่อเริ่มต้น JVM
  • XX: MaxPermSize – ขนาดสูงสุดที่สามารถถูก Allocate ได้เมื่อเริ่มต้น JVM

Solving Common Problems

20. Directory Content

Java จะช่วยให้คุณดูชื่อของ Subdirectories และ Files ทั้งหมดใน Folder ในรูปแบบของ Array

21. Execution of Console Commands

Java อนุญาตให้คุณสามารถ Execute Console Commands ได้โดยตรงจาก Code โดยใช้ Runtime Class มันสำคัญมากที่จะต้องไม่ลืมการจัดการกับ Exception 

ตัวอย่างเช่น ลองเปิด PDF File ผ่าน Java Terminal:

22. Sound Reproduction

เสียงเป็นองค์ประกอบที่สำคัญของหลาย ๆ Application อย่างเช่น ใน Game โดยภาษา Java Programming  ได้จัดเตรียมวิธีที่จะทำงานกับพวกมันไว้ให้แล้ว

23. Sending Email

การส่ง Email ไปยัง Java นั้นเป็นสิ่งที่ทำได้ง่ายมาก คุณเพียงแค่ต้องติดตั้ง Java Mail และระบุ Path ไปถึงมันใน Project Classpath

24. Capture Cursor Coordinates

ในการตรวจจับ Mouse Events คุณจะต้อง Implement MouseMotionListener Interface เมื่อ Cursor อยู่ในพื้นที่ใดพื้นที่หนึ่ง ตัว Event Handler จะเรียกใช้ mouseMoved ซึ่งคุณจะสามารถทราบพิกัดที่แน่นอนได้

ที่มา:  https://www.techy360.com/

 

 

รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert

 

อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความล่าสุด