JavaRush /จาวาบล็อก /Random-TH /Java ใหม่... อีกครั้ง... พบกับ Java 10

Java ใหม่... อีกครั้ง... พบกับ Java 10

เผยแพร่ในกลุ่ม
ก่อนหน้านี้ นักพัฒนาต่างรอคอย Java ตัวใหม่มาเป็นเวลาหลายปี บางตัวก็น่าสยดสยอง และบางตัวก็มีความหวัง เวลามีการเปลี่ยนแปลง และ JDK เวอร์ชันใหม่จะสร้างความพึงพอใจให้กับเราทุกๆ หกเดือน หากยังไม่ชัดเจนสำหรับคุณว่าสิ่งนี้จะนำไปสู่อะไร ลองดูความคิดเห็นของผู้เชี่ยวชาญและที่นี่เราจะแสดงรายการการเปลี่ยนแปลงหลักใน Java 10 ซึ่งเป็นเวอร์ชันใหม่ล่าสุดของภาษาที่เราชื่นชอบ Java ใหม่... อีกครั้ง... พบกับ Java 10 - 1ในวงเล็บเหลี่ยมก่อน "คุณลักษณะ" ใหม่ หมายเลข JEP จะถูกระบุ ซึ่งก็คือ "ข้อเสนอการปรับปรุง JDK" JEP เป็นข้อเสนอเพื่อปรับปรุง OpenJDK และอาจได้รับการอนุมัติ ล่าช้า หรือถูกปฏิเสธ โดยพื้นฐานแล้ว การรวบรวม JEP ถือเป็นกลยุทธ์การพัฒนาสำหรับ OpenJDK

คุณสมบัติที่สำคัญของ Java 10

[286] การอนุมานประเภทตัวแปรท้องถิ่น - ข้อเสนอเพื่อแนะนำคีย์เวิร์ด var ใน Java ซึ่งไม่จำเป็นต้องระบุประเภทของตัวแปรท้องถิ่นอย่างชัดเจน นั่นคือตอนนี้คุณไม่สามารถระบุประเภทของตัวแปรเริ่มต้นได้ แต่เขียนดังนี้:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
สิ่งนี้จะช่วยลดความซ้ำซ้อนของคำจำกัดความประเภท ArrayList<String> ที่เราต้องใช้มาก่อน เป็นเรื่องน่าสนใจที่จะทราบว่า var ไม่ได้กลายเป็นคำหลัก แต่เป็นประเภทที่สงวนไว้ นั่นคือ คุณสามารถใช้ var เป็นชื่อของตัวแปร วิธีการ หรือแพ็คเกจได้ แต่คุณจะไม่สามารถตั้งชื่อชั้นเรียนแบบนั้นได้ (น่าเสียดาย!) [296] การรวมฟอเรสต์ JDK ให้เป็นที่เก็บข้อมูลเดียว JDK 9 มีที่เก็บแปดแห่ง - root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn ใน Java 10 ฟอเรสต์ทั้งหมดนี้จะถูกรวมเข้าไว้ในที่เก็บเดียว เพื่อให้สามารถดำเนินการคอมมิชชันแบบอะตอมมิกข้ามที่เก็บของชุดการแก้ไขที่พึ่งพาซึ่งกันและกัน [304] อินเทอร์เฟซ Garbage-Collectorไม่ใช่อินเทอร์เฟซที่นักพัฒนาสามารถใช้เพื่อควบคุมการรวบรวมขยะ แต่เราได้รับอินเทอร์เฟซตัวรวบรวมขยะที่สะอาดในซอร์สโค้ด JVM แทน ซึ่งช่วยให้คุณสามารถรวมตัวรวบรวมทางเลือกได้อย่างรวดเร็วและง่ายดาย ผู้ที่ใฝ่ฝันที่จะเพิ่มตัวเก็บขยะของตนเองใน JVM จะพอใจกับการปรับปรุงนี้มากที่สุด [ 307 ] Parallel Full GC สำหรับเครื่องรวบรวมขยะ G1 ใน JDK 9 นั้น G1 จะกลายเป็นตัวรวบรวมขยะเริ่มต้น ในขณะที่ก่อนหน้านี้ตัวรวบรวมขยะเริ่มต้นคือ Parallel GC ซึ่งสามารถรวบรวมขยะข้ามหลายเธรดได้ ตอนนี้ G1 ก็ทำได้เช่นกัน ก่อนหน้านี้ทำได้ในเธรดเดียว ซึ่งบางครั้งก็ทำให้เกิดปัญหา อย่างไรก็ตาม นักพัฒนาจะสามารถกำหนดค่าจำนวนเธรดโดยใช้พารามิเตอร์ - XX:ParallelGCThreads. [310] Application Class-Data Sharing - การพัฒนานี้นำมาใช้ใน Java 10 ให้การโหลดและการติดตามที่ได้รับการปรับปรุง ขยายคุณสมบัติ Class Sharing (CDS) ที่มีอยู่ เพื่ออนุญาตให้คลาสแอปพลิเคชันอยู่ในไฟล์เก็บถาวรทั่วไป Class-Data Sharingหรือ CDS สำหรับงานสั้นกับไฟล์ที่มีนามสกุล *class ฟังก์ชั่นนี้ช่วยให้คุณเลือกชุดย่อยของคลาส ประมวลผลและบีบอัดลงในไฟล์เก็บถาวรพิเศษ ทั้งหมดนี้ทำเพื่อประหยัดหน่วยความจำ บ่อยครั้งที่อินสแตนซ์ที่แตกต่างกันของ JVM โหลดคลาสเดียวกันที่รวมอยู่ในไลบรารีมาตรฐาน และ CDS อนุญาตให้อินสแตนซ์ JVM เหล่านี้แบ่งปันไฟล์เก็บถาวรเดียวกับคลาสที่อยู่ในนั้น ซึ่งจะช่วยลดทั้งเวลาในการโหลดโปรแกรมและการใช้หน่วยความจำ ในความเป็นจริง CDS ปรับปรุงประสิทธิภาพการเริ่มต้น JVM และลดปริมาณการใช้ทรัพยากรเมื่อ JVM หลายตัวทำงานบนเครื่องจริงหรือเครื่องเสมือนเดียวกัน โดยเริ่มจากเวอร์ชัน 5 แต่ก่อนหน้านี้ การใช้ CDS ถูกจำกัดไว้เฉพาะตัวโหลดบูตสแตรปเท่านั้น ขณะนี้เวอร์ชันขยายที่เรียกว่า Application CDS ช่วยให้คุณสามารถโหลดไฟล์เก็บถาวรพิเศษพร้อมคลาสสำหรับตัวโหลดอื่น ๆ [312] Thread-Local Handshakesเป็นการเปลี่ยนแปลงระดับต่ำภายใน JVM ที่จะอนุญาตให้ดำเนินการเรียกกลับข้ามเธรดโดยไม่ต้องรันจุดความปลอดภัยของ VM ส่วนกลาง ซึ่งจะทำให้คุณสามารถหยุดแต่ละเธรดได้โดยไม่มีค่าใช้จ่าย แทนที่จะหยุดทั้งหมดพร้อมกัน (หรือหยุดเลย) [313] ลบ Native-Header Generation Tool (javah ) ย้อนกลับไปใน Java 9 นักพัฒนาภาษาเริ่มลบเครื่องมือที่ไม่จำเป็นออกอย่างจริงจัง และ JEP 313 ยังคงทำงานได้ดีต่อไป เครื่องมือ Javah จะสร้างส่วนหัว JNI หากมีวิธีการดั้งเดิมในโค้ด สุขภาพดี? แน่นอน แต่คอมไพลเลอร์ javac ดั้งเดิมที่เริ่มต้นด้วย JDK 8 นั้นสามารถสร้างส่วนหัว JNI ได้เอง ตอนนี้พวกเขาจึงตัดสินใจกำจัดจาวา อย่างไรก็ตาม โครงการ ปานามากำลังอยู่ระหว่างการพัฒนาซึ่งโดยเฉพาะอย่างยิ่งสามารถทดแทน JNI ได้ [314] ส่วนขยายแท็กภาษา Unicode เพิ่มเติมการเปลี่ยนแปลงนี้มีจุดมุ่งหมายเพื่อปรับปรุงคลาส java.util.Locale และ API ที่เกี่ยวข้องเพื่อใช้ส่วนขยาย Unicode เพิ่มเติมกับแท็กภาษา BCP 47 โดยเฉพาะ แท็กสำหรับประเภทสกุลเงิน (cu) วันแรก ตอนนี้จะได้รับการรองรับการแทนที่สัปดาห์ (fw) ภูมิภาค (rg) และโซนเวลา (tz) [316] การจัดสรรฮีปบนอุปกรณ์หน่วยความจำทางเลือกนวัตกรรมนี้จะช่วยผู้ที่ใช้หน่วยความจำประเภทอื่นที่ไม่ใช่ DRAM เนื่องจากเทคโนโลยีมีการเปลี่ยนแปลงอยู่ตลอดเวลา การใช้หน่วยความจำแบบไม่ลบเลือนที่มีอินเทอร์เฟซและคุณลักษณะด้านประสิทธิภาพเหมือนกันซึ่งคล้ายกับ DRAM จึงเป็นความจริงตามวัตถุประสงค์ในปัจจุบัน ดังนั้น JEP 316 จึงอนุญาตให้ JVM วางฮีปในหน่วยความจำประเภทอื่นได้ [317] JIT Compiler ที่ใช้ Java แบบทดลอง เพิ่งมีการประกาศโครงการ Metropolis ซึ่งเสนอให้เขียน JVM ส่วนใหญ่ใน Java ใหม่ ในกรณีที่คุณไม่ทราบ เวอร์ชันปัจจุบันเขียนด้วยภาษา C++ หากคุณรู้อยู่แล้ว ในตอนแรกความคิดดังกล่าวอาจดูแปลกสำหรับคุณ เนื่องจาก JVM เขียนด้วย Java คุณไม่จำเป็นต้องใช้ JVM เพื่อรัน JVM ใช่ไหม นั่นคือการเรียกซ้ำซึ่งชวนให้นึกถึงกระจกที่อยู่ตรงข้ามกัน อย่างไรก็ตาม ความเป็นจริงแตกต่างออกไปเล็กน้อย เพียงเพราะ JVM เขียนด้วยภาษา Java นั่นไม่ได้หมายความว่าคุณจะต้องคอมไพล์มันเป็นไบต์โค้ด คุณสามารถใช้การคอมไพล์ AOT ได้จริง จากนั้น JIT จะคอมไพล์โค้ดขณะทำงานเพื่อปรับปรุงประสิทธิภาพ

เครื่องมือเช่น javac มักใช้เพื่อรวบรวมโค้ด Java มันแปลงโปรแกรม Java ให้เป็นชุดของไฟล์คลาสด้วยรหัสไบต์ จากนั้น JVM จะรัน bytecode ของคุณและล่ามจะแปลงเป็นคำสั่งของตัวประมวลผล นอกจากล่ามแล้ว JVM ยังมีคอมไพเลอร์ในตัว และยังสามารถสร้างคำสั่งสำหรับโปรเซสเซอร์จากรหัสไบต์ได้อีกด้วย นี่คือสิ่งที่เรียกว่าการคอมไพล์รันไทม์ การคอมไพล์ระหว่างการเริ่มต้น โดยปกติแล้วโค้ดที่ใช้บ่อยที่สุดจะต้องได้รับการคอมไพล์ดังกล่าว ซึ่งจะช่วยปรับปรุงประสิทธิภาพ

คอมไพเลอร์สามารถดำเนินการได้หลายวิธี: การคอมไพล์ JIT (ทันเวลา) - ไดนามิก ถูกต้องระหว่างการทำงานของโปรแกรม หรือการคอมไพล์ AOT (ล่วงหน้า) - ก่อนดำเนินการ

คอมไพเลอร์ jaotc AOT เปิดตัวใน JDK 9 ปัจจุบัน Hotspot JVM มีคอมไพเลอร์ JIT สองตัว C1 (สำหรับความเร็ว) และ C2 (สำหรับการเพิ่มประสิทธิภาพ)

JEP 317 แนะนำโครงการวิจัย Graal ซึ่งเป็นคอมไพเลอร์สำหรับ JDK นี่เป็นพื้นฐานบางประการที่จะช่วยทำให้ Metropolis เป็นจริง และช่วยให้ JVM สามารถจับคู่ (หรือดีกว่านั้น เกินกว่า) เวอร์ชันปัจจุบันที่เขียนด้วย C++ ในเชิงประสิทธิภาพ [319] ใบรับรองหลักคือชุดเริ่มต้นของใบรับรองผู้ออกใบรับรองมาตรฐาน (CA) ใน JDK ขณะนี้องค์ประกอบความปลอดภัยที่สำคัญ เช่น TLS จะทำงานตามค่าเริ่มต้นใน OpenJDK builds การเพิ่มที่เป็นประโยชน์นี้อาจเป็นส่วนหนึ่งของสิ่งที่ Oracle กำลังทำเพื่อให้แน่ใจว่าไบนารี OpenJDK และไบนารีของ Oracle JDK มีฟังก์ชันการทำงานเหมือนกัน [322] การกำหนดเวอร์ชันตามเวลา - ใน Java 10 คุณลักษณะใหม่จะถูกเพิ่มในการเผยแพร่คุณลักษณะ และข้อบกพร่องจะได้รับการแก้ไขในการอัปเดต โดยพื้นฐานแล้ว เรามีวิธีใหม่ในการตั้งค่ารูปแบบสตริงเวอร์ชัน JDK แก้ไขสถานการณ์ที่ค่อนข้างแปลกด้วย JDK 9 การอัปเดตครั้งแรกคือ JDK 9.0.1 ซึ่งค่อนข้างสมเหตุสมผล การอัปเดตครั้งที่สองคือ JDK 9.0.4 ซึ่งไร้เหตุผล ตรรกะคือภายในโครงร่างการกำหนดหมายเลขเวอร์ชัน JDK 9 จะมีการเว้นช่องว่างระหว่างการอัปเดตในกรณีฉุกเฉิน การอัปเดตโดยไม่ได้วางแผนไว้ เนื่องจากไม่จำเป็นต้องอัปเดต ทำไมไม่เรียกมันว่า JDK 9.0.2 ล่ะ? และนี่คือลักษณะของเวอร์ชัน Java ใหม่:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

API ใหม่

มี 73 รายการเพิ่มเติมในไลบรารีคลาสมาตรฐาน JDK 10
  • java.awt.Toolkit

    int getMenuShortcutKeyMaskEx (): กำหนดว่าคีย์ตัวปรับแต่งเพิ่มเติมใดที่เป็นคีย์ตัวเร่งความเร็วที่สอดคล้องกันสำหรับเมนูทางลัด

  • java.awt.geom.Path2D:

    void trimToSize (): ตัดความจุของอินสแตนซ์นี้Path2Dให้เป็นขนาดปัจจุบัน แอปพลิเคชันสามารถใช้การดำเนินการนี้เพื่อลดการจัดเก็บพาธให้เหลือน้อยที่สุด มีการเพิ่มวิธีการเดียวกันนี้ให้กับคลาสภายในPath2D.DoubleและPath2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): overloaded toStringแปลงเนื้อหาของบัฟเฟอร์ให้เป็นสตริงโดยการถอดรหัสไบต์โดยใช้การเข้ารหัสที่ระบุ

  • java.io.PrintStream และ lang.io.PrintWriter:

    ทั้งสองคลาสนี้มีตัวสร้างใหม่สามตัวที่รับอาร์กิวเมนต์charsetเพิ่มเติม

  • java.io.ผู้อ่าน:

    long transferTo (Writer): อ่านอักขระทั้งหมดจากโปรแกรมอ่านนี้และเขียนอักขระไปยังผู้เขียนที่กำหนดตามลำดับที่อ่าน

  • java.lang.Runtime.เวอร์ชัน:

    สี่วิธี ใหม่ที่ส่งคืนค่าจำนวนเต็มสำหรับเวอร์ชันใหม่ (JEP 322) ของฟิลด์สตริง: feature (), interim ()และpatch ()update ()

  • java.lang.StackWalker.StackFrame:

  • สตริง getDescriptor():

    ส่งคืนหมายเลขอ้างอิงไปยังเมธอดที่แสดงโดยเฟรมสแต็กนี้ ตามที่กำหนดโดยข้อกำหนด Java Virtual Machine

  • สตริง getMethodType():

    return MethodTypeแสดงถึงประเภทพารามิเตอร์และประเภทการส่งคืนสำหรับวิธีการที่แสดงโดยเฟรมสแต็ก

  • java.lang.inurge.MethodType:

    Class <?> LastParameterType (): возвращает последний тип параметра этого типа метода. Если этот тип не имеет параметров, instead of него возвращается meaning sentinel void.class.

  • java.lang.management.RuntimeMXBean:

    long getPid () возвращает pid запущенной виртуальной машины Java.

  • java.lang.management.ThreadMXBean:

    ThreadInfo [] dumpAllThreads (boolean, boolean, int): возвращает информацию о потоке для всех потоков в реальном времени с трассировкой стека с указанным максимальным количеством элементов и информацией о синхронизации.

  • ThreadInfo [] getThreadInfo (long [], boolean, boolean, int):

    возвращает информацию о потоке для каждого потока, чья идентификация находится во входном массиве, с трассировкой стека указанного максимального количества элементов и информацией о синхронизации.

  • java.lang.reflect.MalformedParameterizedTypeException:

    добавлен новый конструктор, который принимает подробное сообщение в виде строки в качестве параметра.

  • java.net.URLDecoder и java.net.URLEncoder:

    оба этих класса получor новые перегруженные методы расcodeирования и codeирования, которые используют charset в качестве дополнительного параметра.

  • java.nio.channels.Channels:

    Два новых статических перегруженных метода, newReader (ReadByteChannel, Charset) и newWriter (WriteByteChannel, Charset), которые позволяют использовать charset.

  • java.nio.file.FileStore:

    long getBlockSize (): возвращает количество byteов на блок в этом хранorще файлов.

  • java.time.chrono:

    три класса в этом пакете, HijrahEra, MiinguoEra и ThaiBuddhistEra, получor метод String getDisplayName (TextStyle, Locale). Он возвращает текстовое Name, используемое для идентификации эпохи, подходящее для представления пользователю.

  • java.time.format.DateTimeFormatter:

    localizedBy (Locale): возвращает копию этого форматтера с локализованными значениями языка, календаря, региона, десятичного стиля и / or часового пояса, которые заменяют значения в этом формате.

  • java.util:

    DoubleSummaryStatistics, IntSummaryStatistics и LongSummaryStatistics получor новый конструктор, который принимает четыре числовых значения. Он создает непустой экземпляр с указанным счетчиком, минимумом, максимумом и суммой.

  • java.util.List, java.util.Map и java.util.Set:

    каждый из этих интерфейсов обзавёлся новым статическим методом copyOf (Collection). Они возвращают неизменяемые List, Map or Set, содержащие элементы данной коллекции, в своем порядке итерации.

  • java.util.Optional, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong:

    каждый из этих классов получает новый метод orElseThrow (), который по существу делает то же самое, что и get (), то есть если condition выполняется, meaning возвращается. В противном случае генерируется исключение NoSuchElementException.

  • java.util.Formatter и java.util.Scanner:

    Оба этих класса получor три новых конструктора, которые на вход получают charset в дополнение к другим аргументам.

  • java.util.Properties:

    Здесь появился новый конструктор, который принимает аргумент int. Это создает пустой список свойств без значений по умолчанию и с начальным размером, содержащим указанное количество элементов без необходимости динамического изменения размера. Также появилась новая, перегруженная version метода replace, которая принимает три параметра Object и возвращает логическое meaning.

  • java.SplittableRandom:

    void nextBytes (byte []): заполняет предоставленный пользователем массив byteов с генерируемыми псевдослучайными byteами.

  • java.util.concurrent.FutureTask:

    добавлен метод toString (), который возвращает строку, идентифицирующую FutureTask, а также ее состояние завершения. Состояние (в скобках) содержит одну из строк: «Completed Normally» (нормальное завершение), «Completed Exceptionally» (завершение с исключением), «Cancelled» (отменено) or «Not completed» (не завершено).

  • java.util.concurrent.locks.StampedLock:

    новые методы boolean isLockStamp (long), boolean isOptimisticReadStamp (long), boolean isReadLockStamp (long) и boolean isWriteLockStamp (long).

  • java.jar.JarEntry:

    String getRealName (): возвращает настоящее Name этого JarEntry. Если JarEntry является записью мультирелизного jar-file, настроенного для обработки, тогда Name, возвращаемое этим методом — Name пути версии, которую представляет JarEntry. Иначе JarEntry возвращает то же Name, что и ZipEntry.getName ().

  • java.util.jar.JarFile:

    Stream <JarEntry> versionedStream (): возвращает поток записей в файле с версией jar. Подобно методу getRealName для JarEntry, связан с мультирелизными jar-fileми.

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): возвращает локализованное Name для данного Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): возвращает локализованное Name для данного Unicode extension key.

  • java.util.stream.Collectors:

    toUnmodifiableList (), toUnmodifiableSet (), toUnmodifiableMap (Function, Function), toUnmodifiableMap (Function, Function, BinaryOperator) — эти четыре новых метода возвращают коллекторы (Collectors), которые накапливают входные элементы в соответствующую немодифицируемую коллекцию.

  • java.lang.model.SourceVersion:

    теперь это поле RELEASE_10 для представления версии JDK 10.

  • java.lang.model.util.TypeKindVisitor6 и javax.lang.model.util.TypeKindVisitor9:

    что-то не вполне понятное:).

  • R visitNoTypeAsModule (NoType, P):

    посещает псевдо-тип MODULE.

  • javax.remote.management.rmi.RMIConnectorServer:

    У этого класса было добавлено два поля: CREDENTIALS_FILTER_PATTERN и SERIAL_FILTER_PATTERN.

  • javax.ButtonModel:

    Представляете, Swing все еще обновляется!

  • ButtonGroup getGroup ():

    возвращает группу, к которой принадлежит кнопка. Обычно используется с radio buttons, которые являются взаимоисключающими в своей группе.

  • javax.plaf.basic.BasicMenuUI:

    Dimension getMinimumSize (JComponent): возвращает минимальный размер указанного компонента, подходящий для внешнего вида.

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION