JavaRush /Блоги Java /Random-TG /Аз 8 то 13: шарҳи пурраи версияҳои Java. Қисми 2

Аз 8 то 13: шарҳи пурраи версияҳои Java. Қисми 2

Дар гурӯҳ нашр шудааст
Ин мақола қисми дуюми баррасии ман дар бораи навовариҳо дар versionҳои Java 8-13 мебошад. Қисми аввал дар ин ҷост . Бе тафсири бештар, биёед идома диҳем: то 25 сентябри соли 2018, вақте ки JDK нав бароварда шуд:

Java 11

Аз 8 то 13: шарҳи пурраи versionҳои Java.  Қисми 2 - 1

var (дар лямбда)

Минбаъд, мо метавонем намудҳои параметрҳои лямбдаро муайян кунем ё ҳангоми навиштани ифодаи лямбда (ифодаҳои ба таври возеҳ чопшудаи ламбда) онҳоро сарфи назар кунем:
Function<String, String> append = (var string) -> string + " Text";
String appendedString = append.apply("Some");
System.out.println(appendedString);
Шумо инчунин метавонед ба параметрҳои лямбда эзоҳҳо илова кунед, бидуни навиштани номи навъи тағирёбанда:
Function<String, String> append = (@NonNull var string) -> string + " Text";

Z(ZGC)

ZGC як коллектори нави ахлот аст, ки кор намекунад. Он хотираи нав ҷудо мекунад, аммо ҳеҷ гоҳ онро бозоғоз намекунад. ZGC ваъда медиҳад, ки миқдори зиёди хотираро бо қобorяти баланд ва таъхири паст идора мекунад (ZGC танҳо дар платформаҳои 64-бит дастрас аст). Рангкунии истинод - ZGC нишондиҳандаҳои 64-битаро бо усуле истифода мебарад, ки рангкунии нишондиҳанда ном дорад. Нишондиҳандаҳои ранга маълумоти иловагиро дар бораи an objectҳои теппа нигоҳ медоранд. Вақте ки хотира пора мешавад, ин барои пешгирӣ кардани таназзули кор кӯмак мекунад, вақте ки GC бояд ҷойеро барои тақсимоти нав пайдо кунад. Ҷамъоварии партовҳо бо истифода аз ZGC аз қадамҳои зерин иборат аст:
  1. ҷаҳон таваққуф мекунад: мо барои расидан ба an objectҳои теппа (ба монанди тағирёбандаҳои маҳаллӣ ё майдонҳои статикӣ) нуқтаҳои ибтидоиро меҷӯем;
  2. чорроҳаи графикҳои an objectӣ, ки аз пайвандҳои реша оғоз мешаванд. Мо ҳар як an objectи ба мо расидаро қайд мекунем (ZGC аз графики an object мегузарад ва аломатҳои рангаро месанҷад, an objectҳои мавҷударо нишон медиҳад);
  3. коркарди баъзе ҳолатҳои канорӣ, ба монанди пайвандҳои заиф;
  4. кӯчонидани an objectҳои зинда, озод кардани майдонҳои калони тӯда барои тезонидани тақсимот.
  5. вақте ки марҳилаи интиқол оғоз меёбад, ZGC теппаро ба саҳифаҳо тақсим мекунад ва дар як вақт як саҳифа кор мекунад;
  6. ZGC ҳаракати ҳама гуна решаҳоро анҷом медиҳад ва боқимондаи ҳаракат ба амал меояд.
Ин мавзӯъ хеле печида ва печида аст. Муҳокимаи муфассал мақолаи алоҳидаро талаб мекунад, бинобар ин ман онро танҳо дар ин ҷо мегузорам:

Epsilon GC

Epsilon як коллектори ахлот аст, ки тақсимоти хотираро идора мекунад, аммо ягон механизми барқарорсозии хотираро амалӣ намекунад. Вақте ки теппаи мавҷудаи Java тамом мешавад, JVM хомӯш мешавад. Яъне, агар шумо эҷод кардани an objectро дар массиви беохир бидуни пайвастшавӣ ба истинод бо ин коллектори ахлот оғоз кунед, барнома бо OutOfMemoryError садама мезанад (ва агар бо ягон дигараш, ин кор намекунад, зеро он an objectҳоро бе истинодҳо тоза мекунад) . Чаро он лозим аст? Ана чаро:
  1. Санҷиши иҷроиш.
  2. Санҷиши фишори хотира.
  3. Санҷиши интерфейси VM.
  4. Кори бениҳоят кӯтоҳ.
  5. Такмилдиҳии таъхири охирин.
  6. Такмor интиқоли охирин.
Истинодҳои муфид: Дигар инноватсияҳо:
  1. ByteArrayOutputStreamусуле гирифт void writeBytes(byte []), ки тамоми byteҳоро аз далел то OutputStream.
  2. FileReaderва FileWriterконструкторҳои нав гирифтанд, ки ба шумо имкон медиҳанд Charset-ро муайян кунед.
  3. Pathду усули навро гирифт, аз як аргументи сатр роҳ ё пайдарпаии сатрҳоро of(String, String [])бармегардонад , ки ҳангоми якҷояшавӣ сатри роҳро ташкил медиҳанд ва : Роҳро аз URI бармегардонад.Pathof(URI)
  4. Pattern— усуле гирифта шудааст asMatchPredicate(), ки тафтиш мекунад, ки оё сатри вуруди додашуда ба намунаи додашуда мувофиқат мекунад (оё он ба шумо имкон медиҳад, ки бо истифода аз ифодаи муқаррарӣ предикат эҷод кунед, то шумо метавонед, масалан, маълумотро дар ҷараён филтр кунед).
  5. StringМан бисёр усулҳои муфидро интихоб кардам, ба монанди:
    • String strip(): ба мо сатрро бармегардонад, ки ин сатр аст ва ҳамаи фосилаҳо дар аввал ва охири сатр хориҷ карда шудаанд (монанд ба trim(), аммо фосилаҳоро ба таври дигар муайян мекунад);
    • String stripLeading(): сатрро, ки ин сатр аст, ба мо бармегардонад ва ҳама гуна фосилаҳои пешро аз сатр хориҷ мекунад;
    • String stripTrailing(): сатрро, ки ин сатр аст, ба мо бармегардонад ва ҳама гуна фосилаҳоро дар охири сатр хориҷ мекунад;
    • Stream lines()Stream: моро аз String, истихроҷшуда аз ин сатр, ки бо ҷудокунакҳои сатр ҷудо шудааст, бармегардонад ;
    • String repeat(int): ба мо сатреро бармегардонад, ки пайвастагии ин сатр аст ва чанд маротиба такрор мешавад.
    • boolean isBlank(): ҳақиқӣ бар мегардонад, агар сатр холӣ бошад ё танҳо фосила дошта бошад, дар акси ҳол дурӯғ.
  6. Thread— усулҳои destroy() ва stop(Throwable) хориҷ карда шуданд.
  7. Filesяк қатор усулҳои нав гирифт:
    • String readString(Path): ҳама маълумотро аз файл ба сатр мехонад, ҳангоми рамзкушоӣ аз byteҳо ба аломатҳо бо истифода аз рамзгузории UTF-8;
    • String readString(Path, Charset): ҳамон тавре ки дар усули дар боло овардашуда, бо фарқияти он, ки рамзкушоӣ аз byteҳо ба аломатҳо бо истифода аз Charset муайяншуда сурат мегирад;
    • Path writeString (Path, CharSequence, OpenOption []): пайдарпайии аломатҳоро ба файл менависад. Аломатҳо бо истифода аз рамзгузории UTF-8 ба byteҳо рамзгузорӣ карда мешаванд;
    • Path writeString(Path, CharSequence,Charset, OpenOption []): Усули дар боло зикршуда, танҳо аломатҳо бо истифода аз рамзгузории дар Charset муайяншуда ба byte рамзгузорӣ карда мешаванд.
Инҳо ҷолибтарин навовариҳои API буданд (ба андешаи хоксоронаи ман), дар ин ҷо якчанд мавод барои баррасии муфассал мавҷуданд:

Java 12

Шаш моҳ мегузарад ва мо марҳилаи навбатии эволютсияи Java-ро мебинем. Пас, вақти он расидааст, ки бели донишро бароварда кобед. Аз 8 то 13: шарҳи пурраи versionҳои Java.  Қисми 2 - 2

Навсозии G1

Барои G1 беҳбудиҳои зерин анҷом дода шуданд:
  1. Хотираи ҷудошудаи истифоданашударо барқарор кунед

    Дар хотираи теппаи Java чунин чизе вуҷуд дорад, ки хотираи истифоданашуда (ё ба ибораи дигар, ғайрифаъол). Дар Java 12 онҳо тасмим гирифтанд, ки ин мушкилотро ҳал кунанд, ҳоло:

    • G1 хотираро аз тӯда дар GC пурра ё дар давоми як даври мувозӣ бармегардонад; G1 кӯшиш мекунад, ки GC-и пурраро пешгирӣ кунад ва дар асоси тақсимоти теппа як ҳалқаи мувозиро оғоз кунад. Мо бояд G1-ро маҷбур кунем, ки хотираро аз тӯда баргардонад.

    Ин такмилдиҳӣ ба иҷроиш тавассути баргардонидани хотира ба таври худкор аз тӯда ба OS, вақте ки G1 истифода намешавад, тамаркуз мекунад.

  2. Қатъи коллексияҳои омехта ҳангоми гузаштани вақти таваққуф

    G1 муҳаррики таҳлorро барои интихоби ҳаҷми кор барои ҷамъоварии партовҳо истифода мебарад. Он an objectҳои зиндаро бидуни таваққуф пас аз муайян кардани маҷмӯа ва оғози тозакунӣ ҷамъ меорад. Ин боиси он мегардад, ки ҷамъкунандаи ахлот аз вақти таваққуф таъиншуда зиёд мешавад. Воқеан, ин мушкилот бо такмилдиҳӣ ҳал карда мешавад, зеро агар вақти зарурӣ барои анҷом додани қадами оянда аз ҳудуди оқилона зиёд бошад, ин қадамро қатъ кардан мумкин аст.

Микробенчмарк

Java 12 санҷишҳои микробенчмаркингро ҷорӣ кард, то иҷрои JVM-ро бо истифода аз меъёрҳои мавҷуда ба осонӣ санҷидан мумкин аст. Ин барои ҳар касе, ки мехоҳад дар худи JVM кор кунад, хеле муфид хоҳад буд. Санҷишҳои иловагӣ бо истифода аз Java Microbenchmark Harness (JMH) сохта шудаанд. Ин санҷишҳо имкон медиҳанд, ки санҷиши доимии иҷроиш дар JVM. JEP 230 ҷорӣ намудани тақрибан 100 санҷишро пешниҳод мекунад ва санҷишҳои нав ҳангоми баровардани versionҳои нави Java ҷорӣ карда мешаванд. Ин аст мисоли санҷишҳои иловашуда .

Шенандоа

Ин як алгоритми ҷамъоварии ахлот (GC) мебошад, ки ҳадафи он кафолат додани вақти вокуниши кам (ҳадди поёнии 10-500 мс) мебошад. Ин вақти таваққуфи GC-ро ҳангоми иҷрои корҳои тозакунӣ ҳамзамон бо риштаҳои Java кам мекунад. Дар Шенандоа, вақти таваққуф аз андозаи теппа новобаста аст. Ин маънои онро дорад, ки вақти таваққуф новобаста аз андозаи теппаи шумо якхела хоҳад буд. Ин хусусияти таҷрибавӣ аст ва ба сохтори стандартии (Oracle) OpenJDK дохил карда нашудааст.

Гузаришро беҳтар кунед

Java 12 ифодаҳои Switchро барои мувофиқати намуна такмил додааст. Синтаксиси нави L → ҷорӣ карда шуд. Дар ин ҷо як рӯйхати нуқтаҳои асосии гузариш нав аст :
  1. Синтаксиси нав зарурати изҳороти танаффусро барои пешгирии хатогиҳо аз байн мебарад.
  2. Ифодаҳои ивазкунӣ дигар ноком намешаванд.
  3. Илова бар ин, мо метавонем константаҳои сершуморро дар як нишона муайян кунем.
  4. ҳолати пешфарз ҳоло дар ифодаҳои гузариш талаб карда мешавад.
  5. танаффус дар ифодаҳои Гузариш барои баргардонидани арзишҳо аз худи реестр истифода мешавад (дар асл, коммутатор метавонад арзишҳоро баргардонад).
Биёед инро ҳамчун мисол дида бароем:
var result = switch (someDay) {
  case "M", "W", "F" -> "MWF";
  case "T", "TH", "S" -> "TTS";
  default -> {
      if(someDay.isEmpty())
            break "Please insert a valid day.";
      else
            break "Looks like a Sunday.";
  }
};
Дастури ниҳоӣ барои иваз кардани ифодаҳо дар Java 13 Дигар хусусиятҳои нав:
  1. String:

    transform(Function f)- Функсияи додашударо ба сатр татбиқ мекунад. Натиҷа метавонад сатр набошад.
    indent(int x)— ба сатр фосилаи x илова мекунад. Агар параметр манфӣ бошад, пас ин шумораи ҷойҳои пешбари хориҷ карда мешаванд (агар имконпазир бошад).

  2. Files- усули ба мисли -ро гирифт mismatch(), ки дар навбати худ мавқеи byteи аввал номувофиқро дар мӯҳтавои ду файл ё -1L дар сурати мавҷуд набудани номувофиқӣ пайдо ва бармегардонад.

  3. Синфи нав пайдо шуд -CompactNumberFormat барои формат кардани адади даҳӣ дар шакли паймон. Намунаи ин шакли паймон 1М ба ҷои 1,000,000 аст. Ҳамин тариқ, ба ҷои нӯҳ аломат танҳо ду ду лозим аст.

  4. Инчунин як чизи нав мавҷуд аст enum, NumberFormatStyleки ду арзиш дорад - LONG ва SHORT.

  5. InputStream усул гирифт skipNBytes(long n) : шумораи n-уми byteро аз ҷараёни вуруд гузаред.

Пайвандҳои ҷолиби Java 12:

Java 13

Ҷаҳон дар як ҷо намеистад, ҳаракат мекунад, инкишоф меёбад, мисли Java - Java 13. Аз 8 то 13: шарҳи пурраи versionҳои Java.  Қисми 2 - 3

Блоки матн

Вақте ки сухан дар бораи муайян кардани сатр меравад, Java ҳамеша каме азоб мекашид. Агар ба мо лозим ояд, ки сатрро бо фосила, танаффуси сатр, иқтибос ё чизи дигар муайян кунем, ин боиси баъзе мушкилот гардид, бинобар ин мо маҷбур шудем, ки аломатҳои махсусро истифода барем: масалан, \n барои танаффуси сатр, ё аз баъзе сатр раҳо шудан худаш. Ин хониши рамзро ба таври назаррас коҳиш медиҳад ва ҳангоми навиштани чунин сатр вақти иловагӣ мегирад. Ин махсусан ҳангоми навиштани сатрҳое намоён мешавад, ки JSON, XML, HTML ва ғайраро намоиш медиҳанд. Дар натиҷа, агар мо хоҳем, ки Json-и хурдро нависем, он чунин хоҳад буд:
String JSON_STRING = "{\r\n" + "\"name\" : \"someName\",\r\n" + "\"site\" : \"https://www.someSite.com/\"\r\n" + "}";
Ва он гоҳ Java 13 ба саҳна меояд ва ба мо ҳалли худро дар шакли нохунакҳои сегонаи дугона пеш аз ва пас аз матн пешниҳод мекунад (ки онҳоро блокҳои матнӣ меноманд). Биёед ба мисоли қаблии json бо истифода аз ин навоварӣ назар кунем:
String TEXT_BLOCK_JSON = """
{
    "name" : "someName",
    "site" : "https://www.someSite.com/"
}
""";
Хеле соддатар ва равшантар, ҳамин тавр не? StringБарои идоракунии ин блокҳо мутаносибан се усули нав илова карда шуданд :
  • stripIndent(): Ҷойҳои тасодуфиро аз сатр хориҷ мекунад. Ин муфид аст, агар шумо сатрҳои бисёрсатрро хонда истода бошед ва мехоҳед, ки ҳамон як истиснои фосилаи тасодуфиро, ки бо эъломияи возеҳ рух медиҳад, татбиқ кунед (аслан моделсозии компилятор барои нест кардани фазои тасодуфӣ);
  • formatted(Object... args ): монанд ба format(String format, Object... arg), аммо барои блокҳои матнӣ;
  • translateEscapes(): Сатрро бо пайдарпаии фирор (ба монанди \r) ба арзиши мувофиқи Юниcodeи тарҷумашуда бармегардонад.

Гузаришро беҳтар кунед

Ифодаҳои гузариш дар Java 12 ҷорӣ карда шуданд ва 13 онҳоро такмил медиҳад. Дар 12 шумо бо истифода аз танаффус арзишҳои бозгаштро муайян мекунед. Дар 13, арзиши бозгашт бо ҳосил иваз карда шуд. Акнун ифодаи гузаришро, ки мо дар бахши Java 12 доштем, метавон чунин навишт:
var result = switch (someDay) {
  case "M", "W", "F" -> "MWF";
  case "T", "TH", "S" -> "TTS";
  default -> {
      if(someDay.isEmpty())
          yield "Please insert a valid day.";
      else
          yield "Looks like a Sunday.";
  }
};
Ҳарчанд қабули танаффус барои мо барномасозоне, ки аллакай бо Java шинос буданд, муқаррарӣ буд, аммо ин хеле аҷиб буд. Кӯшиши ба ман гуфтани ҳақиқӣ чист? Калимаи нави даромад (нисбатан нав) равшантар аст ва метавонад дар дигар ҷойҳое пайдо шавад, ки арзишҳо баргардонида мешаванд. Барои онҳое, ки ба ин мавзӯъ таваҷҷӯҳи амиқ доранд, ман тавсия медиҳам, ки бо ин маводҳо шинос шавед:

Архивҳои динамикии CDS

CDS - Мубодилаи маълумот дар синф. Ба шумо имкон медиҳад, ки маҷмӯи синфҳои маъмулан истифодашавандаро дар бойгонӣ баста кунед, ки баъдтар метавонанд аз ҷониби якчанд мисолҳои JVM бор карда шаванд. Чаро ба мо ин лозим аст? Гап дар он аст, ки JVM дар ҷараёни боркунии синфҳо амалҳои зиёди захиравиро иҷро мекунад, ба монанди хондани синфҳо, нигоҳ доштани онҳо дар сохторҳои дохилӣ, тафтиши дурустии синфҳои хондашуда, ҷустуҷӯ ва боркунии синфҳои вобаста ва ғайра. , ва танхо баъди хамаи ин синфхо ба кор омода мешаванд. Фаҳмост, ки захираҳои зиёде сарф мешаванд, зеро мисолҳои JVM аксар вақт як синфҳоро бор мекунанд. Масалан, String, LinkedList, Integer. Хуб, ё синфҳои ҳамон як барнома ва ҳамаи инҳо захираҳо мебошанд. Агар мо ҳама қадамҳои заруриро танҳо як маротиба иҷро кунем ва баъд синфҳои аз нав тарҳрезишударо дар бойгонӣ ҷойгир кунем, ки он метавонад ба хотираи якчанд JVM бор карда шавад, ин метавонад фазои хотираро ба таври назаррас сарфа кунад ва вақти оғози барномаро кам кунад. Дар асл, CDS имкон медиҳад, ки маҳз чунин бойгонӣ эҷод карда шавад. Java 9 танҳо иҷозат дод, ки синфҳои системавӣ ба бойгонӣ илова карда шаванд. Java 10 - синфҳои барномаро дар бойгонӣ дохил кунед. Таъсиси чунин архив аз инҳо иборат аст:
  • эҷод кардани рӯйхати синфҳои аз ҷониби барнома боршуда;
  • эҷод кардани бойгонии хеле зарурӣ бо синфҳое, ки мо ёфтем.
Навоварӣ дар Java 13 CDS-ро такмил медиҳад, то он метавонад ҳангоми қатъ шудани барнома бойгонӣ эҷод кунад. Ин маънои онро дорад, ки ду қадами дар боло овардашуда ҳоло ба як муттаҳид карда мешаванд. Ва як нуктаи муҳими дигар: ба бойгонӣ танҳо синфҳое, ки ҳангоми кор кардани барнома бор карда шудаанд, илова карда мешаванд. Ба ибораи дигар, он синфҳое, ки то ҳол дар application.jar мавҷуданд, вале бо ягон сабаб бор карда нашудаанд, ба бойгонӣ илова карда намешаванд.

Навсозии API Socket

API-и Socket ( java.net.Socket ва java.net.ServerSocket ) аслан як ҷузъи ҷудонашавандаи Java аз замони пайдоишаш мебошад, аммо розеткаҳо дар бист соли охир ҳеҷ гоҳ нав карда нашудаанд. Дар C ва Java навишта шуда буданд, онҳо хеле ва хеле калон буданд ва нигоҳдорӣ душвор буданд. Аммо Java 13 тасмим гирифт, ки ба ин масъала ислоҳоти худро ворид кунад ва татбиқи асосиро иваз кард. Ҳоло, ба ҷои PlainSocketImpl, интерфейси провайдер бо NioSocketImpl иваз карда шудааст . Ин татбиқи нави рамзгузорӣ ба ҳамон инфрасохтори пуштибонии java.nio асос ёфтааст . Аслан синф кэши буферии java.util.concurrent ва механизми қулфкуниро (ки ба сегмент асос ёфтааст) истифода мебарад, на усулҳои ҳамоҳангшуда. Он дигар codeи модариро талаб намекунад ва интиқолро ба платформаҳои гуногун осон мекунад. Бо вуҷуди ин, мо роҳи баргаштан ба истифодаи PlainSocketImpl дорем , аммо аз ҳоло NioSocketImpl ба таври нобаёнӣ истифода мешавад .

Бозгашти хотира барои ZGC

Тавре ки мо дар хотир дорем, коллектори партовҳои Z дар Java 11 ҳамчун механизми ҷамъоварии партовҳои камдаромад ҷорӣ карда шуд, то таваққуфи GC ҳеҷ гоҳ аз 10 мс зиёд набошад. Аммо дар айни замон, бар хилофи дигар нуқтаҳои виртуалии GC, ба монанди Shenandoah ва G1, он метавонад хотираи динамикии истифоданашударо ба ОС баргардонад. Ин тағирот ин қобorяти J-ро ба ZGC илова мекунад. Мутаносибан, мо изофаи хотираи камшударо дар баробари беҳтар шудани кор ба даст меорем ва ZGC ҳоло хотираи номаҳдудро ба системаи оператсионӣ ба таври нобаёнӣ бармегардонад, то он даме, ки андозаи ҳадди ақали тӯдаи муайяншуда ба даст ояд. Боз як чизи дигар: ZGC ҳоло андозаи ҳадди аксар дастгирӣшавандаи 16 TB дорад. Пештар, 4TB маҳдудият буд. Дигар инноватсияҳо:
  1. javax.security- хосият jdk.sasl.disabledMechanismsбарои хомӯш кардани механизмҳои SASL илова карда шуд.
  2. java.nio- усул илова карда шуд FileSystems.newFileSystem (Path, Map <String,?>)- мутаносибан барои сохтани файли нав.
  3. Синфҳо java.nioҳоло мутлақ (бар хилофи нисбӣ) getва set-методҳо доранд. Онҳо, ба монанди синфи абстрактии базавӣ Buffer, усули slice()ҷустуҷӯи қисми буферро дар бар мегиранд.
  4. Усулҳои иловашуда javax.xml.parsersбарои эҷоди заводҳои DOM ва SAX (бо дастгирии фазои ном).
  5. Дастгирии Юниcode ба versionи 12.1 навсозӣ шудааст.
Истинодҳои ҷолиб дар Java 13:

Натиҷаҳо

Мо метавонем навовариҳои эълоншударо дар Java 14 аз назар гузаронем, аммо азбаски он ба зудӣ равшанӣ хоҳад дид - JDK 14 17 марти соли 2020 бароварда мешавад, беҳтар мебуд, ки фавран пас аз нашри он баррасии алоҳида ва пурраи онро гузаронем. . Ман инчунин мехоҳам таваҷҷӯҳи шуморо ба он ҷалб намоям, ки дар дигар забонҳои барномасозӣ бо танаффусҳои тӯлонии байни релизҳо, ба монанди Python 2–3, мувофиқат вуҷуд надорад: яъне агар code дар Python 2 навишта шуда бошад, шумо Барои тарҷумаи он ба 3. Java сахт меҳнат кардан лозим аст . Ин маънои онро дорад, ки барномаи Java 5 ё 8-и шумо кафолат дода мешавад, ки дар мошини виртуалии Java 8-13 кор кунад - бо истиснои чанд истисно, ки ҳоло ба шумо лозим нест, ки дар бораи он хавотир шавед. Маълум аст, ки ин ба таври дигар кор намекунад: масалан, агар барномаи шумо функсияҳои Java 13-ро истифода барад, ки дар Java 8 JVM дастрас нестанд. Ин ҳама барои имрӯз дорам, эҳтиром ба онҳое, ки то ин вақт хондаанд)) Аз 8 то 13: шарҳи пурраи versionҳои Java.  Кисми 2 — 5
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION