JavaRush /Blog Java /Random-PL /Nowa Java... Jeszcze raz... Poznaj Javę 10

Nowa Java... Jeszcze raz... Poznaj Javę 10

Opublikowano w grupie Random-PL
Wcześniej programiści czekali na nową Javę kilka lat, niektórzy z przerażeniem, a niektórzy z nadzieją. Czasy się zmieniły i co pół roku będą nas zachwycać nowe wersje JDK. Jeśli jeszcze nie jest dla Ciebie jasne, do czego to doprowadzi, zapoznaj się z opinią eksperta , a tutaj wyszczególnimy główne zmiany w Javie 10, najnowszej wersji naszego ulubionego języka. Nowa Java... Jeszcze raz... Poznaj Javę 10 - 1W nawiasach kwadratowych przed nową „funkcją” wskazany jest numer JEP, czyli „Propozycja ulepszenia JDK”. JEP to propozycja ulepszenia OpenJDK, która może zostać zatwierdzona, opóźniona lub odrzucona. Oznacza to, że w istocie zbiór JEP jest strategią rozwoju OpenJDK.

Ważne funkcje Java 10

[286] Wnioskowanie o typie zmiennej lokalnej - propozycja wprowadzenia słowa kluczowego var do Javy, eliminując potrzebę jawnego określania typu zmiennej lokalnej. Oznacza to, że teraz nie możesz określić typu zainicjalizowanej zmiennej, ale napisz coś takiego:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
Eliminuje to duplikację definicji typu ArrayList<String>, której musielibyśmy wcześniej używać. Warto zauważyć, że var nie staje się słowem kluczowym, ale jest typem zastrzeżonym. Oznacza to, że możesz użyć var ​​jako nazwy zmiennej, metody lub pakietu. Ale nie będziesz mógł nazwać klasy w ten sposób (co za strata!). [296] Łączenie lasu JDK w jedno repozytorium . JDK 9 ma osiem repozytoriów - root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn. W Javie 10 cały las zostanie połączony w jedno repozytorium, aby umożliwić wykonywanie niepodzielnych zatwierdzeń w repozytoriach współzależnych zestawów zmian. [304] Interfejs Garbage-Collector nie jest interfejsem, który może być używany przez programistów do kontrolowania zbierania śmieci. Zamiast tego otrzymujemy czysty interfejs zbieracza śmieci w kodzie źródłowym JVM, pozwalający szybko i łatwo zintegrować alternatywne moduły zbierające. Ci, którzy marzyli o dodaniu własnego modułu zbierającego śmieci do JVM, będą najbardziej zadowoleni z tego ulepszenia. [307] Równoległe pełne GC dla modułu zbierającego elementy bezużyteczne G1 . W JDK 9 domyślnym modułem zbierającym elementy bezużyteczne stał się G1, podczas gdy wcześniej domyślnym modułem zbierającym elementy bezużyteczne był Parallel GC, który mógł zbierać elementy bezużyteczne z wielu wątków. Teraz G1 też może to zrobić, wcześniej robił to w jednym wątku, co czasami powodowało trudności. Nawiasem mówiąc, programiści będą mogli skonfigurować liczbę wątków za pomocą parametru - XX:ParallelGCThreads. [310] Application Class-Data Sharing - to rozwiązanie, przyjęte w Javie 10, zapewnia ulepszone ładowanie i śledzenie, rozszerza istniejącą funkcję Class Sharing (CDS) aby umożliwić lokalizowanie klas aplikacji w archiwum ogólnym. Class-Data Sharing lub CDS do krótkich prac z plikami z rozszerzeniem *class. Ta funkcja pozwala wybrać określony podzbiór klas, przetworzyć je i skompresować do specjalnego archiwum. Wszystko to ma na celu oszczędzanie pamięci. Często różne instancje JVM ładują te same klasy zawarte w bibliotece standardowej. CDS umożliwia wszystkim instancjom JVM współdzielenie jednego archiwum z umieszczonymi w nim klasami. Skraca to zarówno czas ładowania programu, jak i zużycie pamięci. W rzeczywistości CDS poprawia wydajność uruchamiania JVM i zmniejsza zużycie zasobów, gdy wiele JVM działa na tej samej maszynie fizycznej lub wirtualnej, począwszy od wersji 5. Ale wcześniej użycie CDS ograniczało się tylko do modułu ładującego ładującego. Teraz rozszerzona wersja o nazwie Application CDS umożliwia ładowanie specjalnych archiwów z klasami dla innych programów ładujących. [312] Uzgadnianie lokalne wątku to zmiana dość niskiego poziomu wewnątrz JVM, która umożliwi wykonywanie wywołań zwrotnych między wątkami bez uruchamiania globalnego punktu bezpieczeństwa maszyny wirtualnej. Umożliwi to bezkosztowe zatrzymanie pojedynczych wątków, a nie wszystkich na raz (lub żadnego). [313] Usuń narzędzie do generowania nagłówków natywnych (javah) . Wracając do Java 9, twórcy języków zaczęli aktywnie usuwać niepotrzebne narzędzia, a JEP 313 kontynuuje tę dobrą robotę. Narzędzie javah generuje nagłówki JNI, jeśli w kodzie znajdują się metody natywne. Zdrowy? Oczywiście, ale natywny kompilator Javac, zaczynając od JDK 8, może sam generować nagłówki JNI. Więc teraz postanowili pozbyć się javah. Nawiasem mówiąc, obecnie opracowywany jest projekt panamski , który w szczególności może zastąpić JNI. [314] Dodatkowe rozszerzenia znaczników języka Unicode Ta zmiana ma na celu ulepszenie klasy java.util.Locale i powiązanych interfejsów API w celu zaimplementowania dodatkowych rozszerzeń Unicode do znaczników języka BCP 47. W szczególności znaczniki typu waluty (cu), dzień pierwszy będzie teraz obsługiwane zastępowanie tygodnia (fw), regionu (rg) i strefy czasowej (tz). [316] Alokacja sterty na alternatywnych urządzeniach pamięci Ta innowacja pomoże tym, którzy używają typów pamięci innych niż DRAM. Ponieważ technologie stale się zmieniają, stosowanie pamięci nieulotnej o tym samym interfejsie i charakterystyce wydajnościowej podobnej do DRAM jest dziś obiektywną rzeczywistością. Zatem JEP 316 umożliwia maszynie JVM umieszczenie sterty w innych typach pamięci. [317] Eksperymentalny kompilator JIT oparty na Javie . Niedawno ogłoszono projekt Metropolis, który proponuje przepisanie większości JVM w Javie. Jeśli nie wiesz, aktualna wersja jest napisana w C++. Cóż, jeśli już to wiesz, prawdopodobnie na początku taki pomysł wyda ci się dziwny. Ponieważ JVM jest napisana w Javie, czy nie potrzebujesz JVM do uruchomienia JVM? Taka jest rekurencja, przypominająca lustra naprzeciw siebie. Rzeczywistość jest jednak nieco inna: to, że maszyna JVM jest napisana w Javie, nie oznacza, że ​​trzeba ją kompilować do postaci kodów bajtowych. W rzeczywistości możesz użyć kompilacji AOT, a następnie JIT kompiluje kod, gdy działa, aby poprawić wydajność.

Do kompilowania kodu Java powszechnie używa się narzędzia takiego jak javac. Konwertuje program Java na zestaw plików klas z kodami bajtowymi. Następnie maszyna JVM uruchamia kod bajtowy, a jego interpreter konwertuje go na instrukcje procesora. Oprócz interpretera, JVM ma również wbudowany kompilator i może również tworzyć instrukcje dla procesora z kodu bajtowego. Jest to tak zwana kompilacja runtime, kompilacja podczas uruchamiania. Zwykle takiej kompilacji poddawany jest najczęściej używany kod - poprawia to wydajność.

Kompilator może wykonywać akcje na różne sposoby: kompilacja JIT (just-in-time) - dynamiczna, bezpośrednio w trakcie wykonywania programu lub kompilacja AOT (z wyprzedzeniem) - przed wykonaniem.

Kompilator jaotc AOT został wprowadzony w JDK 9. Obecnie Hotspot JVM zawiera dwa kompilatory JIT, C1 (dla szybkości) i C2 (dla optymalizacji).

JEP 317 przedstawia projekt badawczy Graal, kompilator dla JDK. Jest to pewna podstawa, która pomoże urzeczywistnić Metropolis i umożliwi JVM dorównanie (lub jeszcze lepiej, przewyższenie) wydajnością bieżącej wersji napisanej w C++. [319] Certyfikaty główne to domyślny zestaw standardowych certyfikatów urzędu certyfikacji (CA) w pakiecie JDK. Krytyczne komponenty bezpieczeństwa, takie jak TLS, będą teraz domyślnie działać w kompilacjach OpenJDK. Ten przydatny dodatek jest prawdopodobnie częścią działań firmy Oracle mających na celu zapewnienie, że pliki binarne OpenJDK i pliki binarne Oracle JDK są funkcjonalnie takie same. [322] Wersjonowanie wersji oparte na czasie — w Javie 10 nowe funkcje będą dodawane do wydań funkcji, a błędy zostaną naprawione w wydaniach aktualizacji. Zasadniczo mamy nowy sposób ustawiania formatów ciągów wersji JDK. Naprawia dość dziwną sytuację z JDK 9. Pierwszą aktualizacją był JDK 9.0.1, co jest całkiem logiczne. Druga aktualizacja to JDK 9.0.4, co jest nielogiczne. Logika jest taka, że ​​w schemacie numeracji wersji JDK 9 pomiędzy aktualizacjami pozostaje odstęp na wypadek awaryjnej, nieplanowanej aktualizacji. Skoro aktualizacja nie była konieczna, dlaczego nie nazwać jej po prostu JDK 9.0.2? A oto jak wygląda nowy format wersji Java:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

Nowe interfejsy API

Do bibliotek klas standardowych JDK 10 dodano 73 dodatki.
  • Java.awt.Zestaw narzędzi

    int getMenuShortcutKeyMaskEx (): Określa, który rozszerzony klawisz modyfikujący jest odpowiadającym klawiszem skrótu dla menu skrótów.

  • java.awt.geom.Path2D:

    void trimToSize (): Przycina pojemność tej instancji Path2Ddo jej bieżącego rozmiaru. Aplikacja może użyć tej operacji, aby zminimalizować przechowywanie ścieżek. Ta sama metoda została dodana do klas wewnętrznych Path2D.Doublei Path2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): przeciążony toString, konwertuje zawartość bufora na ciąg poprzez dekodowanie bajtów przy użyciu określonego kodowania.

  • java.io.PrintStream i lang.io.PrintWriter:

    Obie te klasy mają trzy nowe konstruktory, które przyjmują dodatkowy argument charset.

  • Java.io.Reader:

    long transferTo (Writer): Odczytuje wszystkie znaki z tego czytnika i zapisuje je danemu pisarzowi w kolejności, w jakiej są czytane.

  • Java.lang.Runtime.Version:

    Cztery nowe metody zwracające wartość całkowitą dla nowej wersji (JEP 322) pól łańcuchowych : feature (), i .interim ()patch ()update ()

  • java.lang.StackWalker.StackFrame:

  • Ciąg getDescriptor():

    zwraca uchwyt do metody reprezentowanej przez tę ramkę stosu, zgodnie ze specyfikacją wirtualnej maszyny Java.

  • Ciąg getMethodType():

    zwraca MethodType, reprezentujący typy parametrów i typ zwracany dla metody reprezentowanej przez ramkę stosu.

  • Typ metody java.lang.invoke.Method:

    Class <?> LastParameterType (): возвращает последний тип параметра этого типа метода. Если этот тип не имеет параметров, zamiast него возвращается oznaczający 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:

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

  • java.nio.channels.Channels:

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

  • java.nio.file.FileStore:

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

  • java.time.chrono:

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

  • java.time.format.DateTimeFormatter:

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

  • java.util:

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

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

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

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

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

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

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

  • java.util.Properties:

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

  • java.SplittableRandom:

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

  • java.util.concurrent.FutureTask:

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

  • java.util.concurrent.locks.StampedLock:

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

  • java.jar.JarEntry:

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

  • java.util.jar.JarFile:

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

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): возвращает локализованное Nazwa для данного Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): возвращает локализованное Nazwa для данного 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): возвращает минимальный размер указанного компонента, подходящий для внешнего вида.

Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION