Phatcharaphan Ananpreechakun
odds.team
Published in
2 min readJan 22, 2021

--

หลีกเลี่ยง Long import lists โดยใช้ Wildcards ใน Java/Kotlin

การ import โดยใช้ wildcard คือ การย่อ import เช่น เมื่อเราต้องการที่จะใช้งานหลายๆ class ใน package เดียวกัน เราก็สามารถใช้ * เพื่อย่อให้เหลือบรรทัดเดียวได้

ตัวอย่าง

เมื่อเราต้องการจะ import หลายๆ class จาก package เดียวกัน เราจะเขียนแบบนี้

เราจะเห็นว่าเมื่อ import หลายๆ class ในไฟล์นั้นเยอะ เราก็เลยขี้เกียจหรืออยากจะย่อ หรือ IDE auto หรือบลาๆๆ ใส่ให้ ซึ่ง java หรือ kotlin ก็มี option ให้เราใช้งานโดยใช้ wildcard import (*) ซึ่งจะเป็นแบบนี้

Performance

ในส่วนของ compile-time performance ก็จะมีเพียงเล็กน้อย เนื่องจาก compiler จะทำการแปลง source code ไปเป็น bytecode files ก่อน

ตัวอย่างแรก ถ้ามีการใช้ wildcard import ดังตัวอย่างที่ 1 นั้นสิ่งที่เกิดขึ้นก็คือ compiler จะเห็นว่ามี Calendar ที่เราประกาศไว้ใน code และทำการไปค้นหาใน package ที่ทำการ import เข้ามา ถ้าเจอจะนำไป compile เมื่อทำการ compilation เสร็จ ก็จะไม่มีการแสดง import ใน bytecode นั้น

(1)
import java.util.*
////.........val cal = Calendar.getInstance()..........

จึงเป็นสาเหตุ ถ้าเราใช้ wildcard import เวลา runtime จะไม่มีผลต่อ performance เลย

ตัวอย่างสอง ถ้ามีการ import แบบเจาะจง class ที่เราต้องการเลย compiler ก็จะไม่ต้องไปค้นหาใน package แล้ว compiler ก็จะนำไปไป compile เลย

(2)
import java.util.Calendar
////.........val cal = Calendar.getInstance()..........

Readability

  • อ่านง่าย รู้ว่า class ที่เราใช้ในมาจาก package ไหน

Ambiguities

  • นำไปสู่ความไม่ชัดเจน เมื่อมี class ที่ชื่อเหมือนกับ package อื่นด้วย

ในบาง Project ก็จะมีการ check style ของ source code ก่อนที่จะทำการ build ซึ่งจะมี rule ในการ disallow wildcard imports

ถ้าใครที่ใช้ IntelliJ IDEA

  • โดย default แล้ว IntelliJ IDEA จะทำการ convert Long import lists ไปเป็น wildcard imports เมื่อเห็นว่ามีการ 5 import statements ใน package เดียวกัน
  • สามารถตั้งค่าได้โดย Preferences -> Editor -> Code Style -> Java (or Kotlin) ไปที่ tab imports

--

--