من حسینکورائی قصد دارم در این مقاله به سوال معروف که، تفاوت میان نسخههای مختلف جاوا در چیست؟ همراه با مثال پاسخ دهم. از زمان انتشار نسخهی جاوا 8، تا نسخه 17 ، جاوا با 194 JDK Enhancement Proposals (JEPs) شکل گرفت که هر کدام پیشرفت هایی را در نسخهی خود به ارمغان می آورد. این مقاله یک خلاصهای از لیستهای طبقه بندی و تنظیم شده از مهمترین پیشرفتها آمادهکردهایم.
شما میتوانید لیست JEPs های هر نسخه را در از لینک مشاهده نمایید.
همه ویژگی ها به طور کلی به طور پیش فرض در دسترس و فعال هستند، مگر اینکه با یکی از موارد زیر برچسب گذاری شده باشند:
Preview :
ویژگی ها کاملاً مشخص و اجرا شده اند، اما هنوز به نهایی نشدهاند. آنها تقریباً کامل تلقی میشوند و اما جهت فعالسازی نهایی نیاز به دریافت بازخوردهای دنیای واقعی دارند.
Experimental :
این دسته از خصوصیات پایدار نبوده و احتمال تغییر در آنها فراوان است.
Incubator :
ابزارها و Apiهایی وجود دارند که نهایینشدهاند و در ماژولهای جداگانه توزیعشدهاند.
آن چه در این مقاله خواهید خواند:
ویژگیهای زبان جدید :
از آنجا که جاوا 8 پیشرفت های زیادی در زبان ایجاد کرده است. این بخش خلاصه ای از اتفاقات سالهای گذشته است.
- کلاسهای Sealed می توانند کلاسهایی را که ممکن است آنها را extend کنند را محدود کنند :
//JDK 17 (Preview In JDK 16 and JDK 15) public abstract sealed class Shape permits Circle, Rectangle {...} public class Circle extends Shape {...} // OK public class Rectangle extends Shape {...} // OK public class Triangle extends Shape {...} // Compile error // No need for default case if all permitted types are covered double area = switch (shape) { case Circle c -> Math.pow(c.radius(), 2) * Math.PI case Rectangle r -> r.a() * r.b() };
- پشتیبانی switch از pattern matching ها :
//JDK 17 String formatted = switch (o) { case Integer i && i > 10 -> String.format("a large Integer %d", i); case Integer i -> String.format("a small Integer %d", i); case Long l -> String.format("a Long %d", l); default -> o.toString(); };
- سادهسازی برای تعریف کلاس های record :
//JDK 16 (Preview In JDK 15 and JDK 14) record Point(int x, int y) { } var point = new Point(1, 2); point.x(); // returns 1 point.y(); // returns 2
- Pattern Matching ها برای instanceof گرفتن نیاز به cast کردن دارند :
//JDK 16 (Preview In JDK 15 JDK 14) if (obj instanceof String s && s.length() > 5) { System.out.println("obj is a String with more than 5 characters: " + s.toUpperCase()); }
- بلوک متنی :
//JDK 15 (Preview In JDK 14 JDK 13) String html = """
Hello, world
"""; - تعمیم هندل شدن خطاهای Null :
//JDK 15 a.b.c.i = 99; --- Exception in thread "main" java.lang.NullPointerException: Cannot read field "c" because "a.b" is null
- عبارت Switch :
//JDK 14 (Preview In JDK 12 JDK 13) int numLetters = switch (day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; default -> { String s = day.toString(); int result = s.length(); yield result; } };
- تعریف متغیر var برای تعریف متغیرهای local :
//JDK 11 (Without lambda support in JDK 10) var greeting = "Hello World!";
- جلوگیری از ClassDefNotFoundErrors در زمان اجرا و ایجاد APIs داخلی :
//JDK 9 module hu.advancedweb.helloworld { requires hu.advancedweb.somedependency; exports hu.advancedweb.hello }
- تعریف متدهای private در intefaceها. (JDK 9)
- Try-with-resources امکان استفاده از متغیرهای final را به صورت موثرتر میدهد. (JDK 9)
- استفاده از @SafeVargs بر روی متدهای private. (JDK 9)
- از بین رفتن اخطارهای منسوخ در importها. (JDK 9)
APIs جدید :
- Process::inputReader, Process::outputWritter, Process::errorReader : توابعی که برای مدیریت streamها در JDK 17 وجود دارند.
- java.time.InstantSource : یک interface که زمان حال را برمیگرداند و برگرفته شده از java.time.Clock است. (JDK 17)
- HexFormat : قابلیت کد و دیکد یک رشته از hexadecimal.
//JDK 17 HexFormat.of().toHexDigits(123); // ==> "0000007b" HexFormat.of().fromHexDigits("0000007b"); // ==> 123
- Vector API : برای انجام محاسباتی که با دستورالعملهای سختافزاری مرتبط است. (JDK 17)
- Foreign linker API : برای دسترسی به کد native
- Foreign memory : دسترسی به حافظه Heap جاوا. (JDK 17)
- Align random generators : بهبود توابع تصادفی مانند : Random, ThreadLocalRandom, SplittableRandom
//JDK 17 new Random().ints() .limit(10) .forEach(System.out::println);
- Stream.toList : بهبود الگوریتم استفاده از آن.
//JDK 16 List
result = Stream.of("one", "two", "three").stream() .filter(s -> s.length() == 3) .toList(); - Stream.mapMulti : بهبود الگوریتم استفاده از آن.
//JDK 16 Stream.of(1, 2, 3, 4) .mapMulti((number, downstream) -> downstream.accept(number)) .forEach(System.out::print); // prints 1234
- یک Builder جدید برای هندل HTTPها.
- DateTimeFormatterBuilder.html#appendDayPeriodText : پشتیبانی از AM/PM
- اضافه شدن کانالهای سوکت دامنه Unix و کانالهای سوکت سرور
- @Serial : برای مشصخ نمودن فیلد و یا متدهایی که از مکانیزم serialization استفاده میکنند.
- Files.mismatch : یافتن اولین بایت ناهماهنگ در دو فایل. (JDK 12)
- Collectors.teeing : برای ایجاد یک مجموعه که ترکیبی از دو کلکسیون پایین دست است. (JDK 12)
- تقویت رشتهها : تو رفتگی و تبدیلات یک رشته. (JDK 12)
- استاندارد HTTP Client شامل HTTP/2 ، پشتیبانی WebSocket و API بدون بلاک:
//JDK 11 HttpClient httpClient = HttpClient.newBuilder().build(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://advancedweb.hu/")) .GET() .build(); HttpResponse
response = httpClient.send(request, BodyHandlers.ofString()); - تقویت رشتهها : isBlank, lines, repeat و strip .
- بهبود Factory method برای مجموعههایی که زیر مجموعه ندارند.
//JDK 9 Set
mySet = Set.of(1, 2, 3); List myList = List.of(1, 2, 3); Map myMap = Map.of("one", 1, "two", 2); - بهبود استریمهای publish-subscribe برای جلوگیری از بلاک شدن.
- بهبود استفاده از زمان مانند تاخیر و timeout.
- اضافه شدن امکانات بیشتر برای تبدیل و یا ایجاد مجموعهها : dropWhile, takeWhile و iterate, ofNullable
- Arrays.mismatch : یافتن اولین ناهماهنگی بین دو آرایه.
- System.Logger : بهبود مکانیزم لاگ در سیستم.
- Stack-Walking API : امکان پیادهسازی مکانیزم lazy و فیلتر کردن فریمها.
- Process API : اطلاعات و کنترل بیشتری را ارائه می دهد (به عنوان مثال شناسه فرآیند ، استدلال ها ، زمان CPU ، فرآیندهای parent/child) ، افزایش ProcessBuilder برای کمک به ایجاد خطوط فرآیند جدید.
- VarHandle API : برای جایگزینی عملیات مربوط به آرایه java.util.concurrent.atomic و sun.misc. ناامن به منظور ایجاد و ارائه مکانیسم های دسترسی سطح پایین، به عنوان مثال استفاده از atomic.
- ترکیب کننده های جدید و روش های جستجو برای MethodHandle
- سیاست انحصاری پیشرفته Deprecated را می توان با forRemoval علامت گذاری کرد که یک هشدار جدید می دهد.
Concurrency :
- امکان متوقف کردن یک ترد بصورت HandShake در JDK 9.
- بهبود عملکرد monitoring در JDK 9.
- فضای اضافی برای Stack ترد و کاهش خطر deadlock در java.util.concurrent در صورت Stack overflow در JDK 9.
Garbage Collector :
- تخصیص حافظه NUMA-Aware در JDK 12.
- بآزادسازی حافظه heap به صورت اتوماتیک. (JDK 12)
- G1 Garbage Collector اکنون بجای Parallel GC به طور پیش فرض تنظیم شده است. (JDK 9)
امنیت :
- اعتبارسنجی دادههای Serialization به عنوان ورودی (JDK 17).
- پیش فرض keystore به جای JKS اختصاصی PKCS12 استاندارد است. (JDK 9)
- SecureRandom مبتنی بر DRBG در (JDK 9).
- زنجیره های گواهی X.509 را با امضای مبتنی بر SHA-1 غیرفعال میشوند. (JDK 9)
- الگوریتم های SHA-3 Hash در (JDK 9).
اجرا :
- پشتبانی از اجرای سورس کدهای تک فایلی ، از جمله پشتیبانی از خط shebang (#!) در یونیکس. (JDK 11)
- jshell: the Java REPL
- کامپایل پروژهای قدیمیتر با –release که با ورژنهای جدید متفاوت هستند. (JDK 9)
- اعتبارسنجی اولیه خط فرمان JVM برای جلوگیری از کرش. (JDK 9)
پشتیبانی از پلتفرمهای جدید :
- macOS/AArch64 در JDK 17
- Windows/AArch64 در JDK 16
- Linux/AArch64 در JDK 9
- Linux/s390x در JDK 9
- Unified arm32/arm64 در JDK 9
منسوخ و حذف شدهها :
- Applet API در JDK 17
- Solaris و SPARC Ports در JDK 14
- Biased locking در JDK 15
- Unsafe::defineAnonymousClass() در JDK 15
- Concurrent Mark Sweep در JDK 14
- ParallelScavenge + SerialOld در JDK 14
- Pack200 Tools و API در JDK 14
- Java EE در JDK 11
- CORBA در JDK 11
- Thread#destroy and Thread#stop در JDK 11
- javah tool در JDK 10
- پکیجهای apple.applescript و com.apple در JDK 9
- X.509 certificate chainsمبتنی بر SHA-1 در JDK 9
- jhat tool در JDK 9
- JVM TI hprof Agent در JDK 9
- Object.finalize() در JDK 9
و در آخر
JDK 8 در سال 2014 منتشر شد. ما مجبور بودیم سه سال و نیم برای JDK 9 منتظر بمانیم. اما از آن به بعد همه چیز شتاب گرفت. جاوا دارای ساختار انتشار جدیدی است که هدف آن ارائه نسخه جدید در هر شش ماه است.
وبسایت میربزرگی قصد دارد تا با ارائه مقاله ها و تجربههای کاربردی شما را در زمینه یادگیری و رفع اشکالاتتان کمک کند. در صورت وجود هرگونه سوالی به من ایمیل بزنید.