คุณสมบัติที่สำคัญของ 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 (สำหรับการเพิ่มประสิทธิภาพ) |
[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)
: overloadedtoString
แปลงเนื้อหาของบัฟเฟอร์ให้เป็นสตริงโดยการถอดรหัสไบต์โดยใช้การเข้ารหัสที่ระบุ -
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
orSet
, содержащие элементы данной коллекции, в своем порядке итерации. -
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)
: возвращает минимальный размер указанного компонента, подходящий для внешнего вида.
What еще почитать? |
---|
GO TO FULL VERSION