JavaRush /جاوا بلاگ /Random-UR /8 سے 13 تک: جاوا ورژنز کا مکمل جائزہ۔ حصہ 1

8 سے 13 تک: جاوا ورژنز کا مکمل جائزہ۔ حصہ 1

گروپ میں شائع ہوا۔
بلی کے بچے، سب کو ہیلو)) تو، آج ہم 2020 میں ہیں، اور جاوا 14 کے ریلیز ہونے تک بہت کم رہ گیا ہے۔ آپ کو 17 مارچ کو تیار شدہ ورژن کی توقع کرنی چاہیے، ہم اس حقیقت کے بعد تجزیہ کریں گے کہ وہاں کیا تازہ اور دلچسپ ہے، لیکن آج میں جاوا کے پچھلے ورژن پر اپنی یادداشت کو تازہ کرنا چاہوں گا۔ وہ ہمارے لیے کیا نیا لائے؟ آئیے ایک نظر ڈالتے ہیں۔ آئیے جاوا 8 کے ساتھ جائزہ شروع کریں، کیونکہ یہ اب بھی کافی متعلقہ ہے اور زیادہ تر پروجیکٹس میں استعمال ہوتا ہے۔ 8 سے 13 تک: جاوا ورژنز کا مکمل جائزہ۔  حصہ 1 - 1پہلے، نئے ورژن ہر 3-5 سال بعد جاری کیے جاتے تھے، لیکن حال ہی میں اوریکل نے ایک مختلف طریقہ اختیار کیا ہے - "ہر چھ ماہ بعد نیا جاوا۔" اور اس طرح، ہر چھ ماہ بعد ہم خصوصیات کی رہائی کو دیکھتے ہیں۔ چاہے یہ اچھا ہو یا برا، ہر کوئی اسے مختلف طریقے سے دیکھتا ہے۔ مثال کے طور پر، مجھے یہ زیادہ پسند نہیں ہے، کیونکہ نئے ورژن میں بہت سی نئی خصوصیات نہیں ہیں، لیکن ساتھ ہی، ورژن بارش کے بعد کھمبیوں کی طرح بڑھ رہے ہیں۔ میں نے جاوا 8 کے ساتھ ایک پروجیکٹ پر ایک دو بار پلکیں جھپکیں، اور جاوا 16 پہلے ہی جاری کیا گیا تھا (لیکن جب یہ شاذ و نادر ہی سامنے آتا ہے، تو نئی خصوصیات جمع ہوتی ہیں، اور آخر میں یہ واقعہ چھٹی کی طرح طویل انتظار میں رہتا ہے: ہر کوئی اس پر بحث کر رہا ہے۔ نئی چیزیں اور آپ اس سے گزر نہیں سکتے)۔ تو آئیے شروع کریں!

جاوا 8

فنکشنل انٹرفیس

یہ کیا ہے؟ ایک فنکشنل انٹرفیس ایک انٹرفیس ہے جس میں ایک غیر لاگو (خلاصہ) طریقہ ہوتا ہے۔ @FunctionalInterface ایک اختیاری تشریح ہے جو اس طرح کے انٹرفیس کے اوپر رکھی گئی ہے۔ یہ چیک کرنے کی ضرورت ہے کہ آیا یہ ایک فنکشنل انٹرفیس کی ضروریات کو پورا کرتا ہے (صرف ایک خلاصہ طریقہ ہے)۔ لیکن ہمیشہ کی طرح، ہمارے پاس کچھ انتباہات ہیں: پہلے سے طے شدہ اور جامد طریقے ان ضروریات کے تحت نہیں آتے ہیں۔ لہذا، اس طرح کے کئی طریقے ہو سکتے ہیں + ایک خلاصہ، اور انٹرفیس فعال ہوگا۔ اس میں آبجیکٹ کلاس کے طریقے بھی شامل ہوسکتے ہیں جو انٹرفیس کی فنکشنل کی تعریف کو متاثر نہیں کرتے ہیں۔ میں پہلے سے طے شدہ اور جامد طریقوں کے بارے میں کچھ الفاظ شامل کروں گا:
  1. ڈیفالٹ موڈیفائر والے طریقے آپ کو انٹرفیس میں نئے طریقے شامل کرنے کی اجازت دیتے ہیں ان کے موجودہ نفاذ کو توڑے بغیر۔

    public interface Something {
      default void someMethod {
          System.out.println("Some text......");
      }
    }

    ہاں، ہاں، ہم انٹرفیس میں لاگو کردہ طریقہ شامل کرتے ہیں، اور اس طریقہ کو نافذ کرتے وقت، آپ اسے اوور رائڈ نہیں کر سکتے، لیکن اسے وراثت میں حاصل کردہ کے طور پر استعمال کر سکتے ہیں۔ لیکن اگر ایک کلاس ایک دیئے گئے طریقہ کے ساتھ دو انٹرفیس کو لاگو کرتی ہے، تو ہمارے پاس ایک تالیف کی خرابی ہوگی، اور اگر یہ انٹرفیس کو لاگو کرتا ہے اور ایک مخصوص یکساں طریقہ کے ساتھ کلاس کو وراثت میں دیتا ہے، تو پیرنٹ کلاس کا طریقہ انٹرفیس کے طریقوں کو اوورلیپ کرے گا اور استثناء کام نہیں کرے گا۔

  2. انٹرفیس میں جامد طریقے کلاس میں جامد طریقوں کی طرح کام کرتے ہیں ۔ مت بھولنا: آپ جامد طریقوں کو وراثت میں نہیں لے سکتے ہیں، بالکل اسی طرح جیسے آپ کسی نسلی طبقے سے جامد طریقہ کو کال نہیں کر سکتے۔

لہذا، فنکشنل انٹرفیس کے بارے میں کچھ اور الفاظ اور آئیے آگے بڑھتے ہیں۔ یہاں FIs کی اہم فہرستیں ہیں (باقی ان کی اقسام ہیں):

    Predicate - دلیل کے طور پر کچھ قدر T لیتا ہے، بولین لوٹاتا ہے۔

    مثال:boolean someMethod(T t);

  • صارف - T قسم کی دلیل لیتا ہے، کچھ بھی نہیں دیتا (باطل)۔

    مثال:void someMethod(T t);

  • سپلائر - ان پٹ کے طور پر کچھ نہیں لیتا، لیکن کچھ قدر T واپس کرتا ہے۔

    مثال:T someMethod();

  • فنکشن - ان پٹ کے طور پر T قسم کا پیرامیٹر لیتا ہے، قسم R کی قدر لوٹاتا ہے۔

    مثال:R someMethod(T t);

  • UnaryOperator - T دلیل لیتا ہے اور T قسم کی قدر لوٹاتا ہے۔

    مثال:T someMethod(T t);

ندی

اسٹریمز ایک فنکشنل انداز میں ڈیٹا ڈھانچے کو ہینڈل کرنے کا ایک طریقہ ہیں۔ عام طور پر یہ مجموعے ہوتے ہیں (لیکن آپ انہیں دوسرے، کم عام حالات میں استعمال کر سکتے ہیں)۔ زیادہ قابل فہم زبان میں، Stream ایک ڈیٹا سٹریم ہے جس پر ہم اس طرح کارروائی کرتے ہیں جیسے کہ ایک ہی وقت میں تمام ڈیٹا کے ساتھ کام کر رہے ہوں، نہ کہ طاقت کے ساتھ، جیسا کہ ہر ایک کے لیے۔ آئیے ایک چھوٹی سی مثال دیکھتے ہیں۔ ہم کہتے ہیں کہ ہمارے پاس نمبروں کا ایک سیٹ ہے جسے ہم فلٹر کرنا چاہتے ہیں (50 سے کم)، 5 کا اضافہ کریں، اور پہلے 4 نمبروں کو بقیہ نمبروں سے کنسول میں آؤٹ پٹ کریں۔ ہم یہ پہلے کیسے کرتے:
List<Integer> list = Arrays.asList(46, 34, 24, 93, 91, 1, 34, 94);

int count = 0;

for (int x : list) {

  if (x >= 50) continue;

  x += 5;

  count++;

  if (count > 4) break;

  System.out.print(x);

}
ایسا لگتا ہے کہ زیادہ کوڈ نہیں ہے، اور منطق پہلے سے ہی تھوڑا سا الجھا ہوا ہے۔ آئیے دیکھتے ہیں کہ یہ سلسلہ کا استعمال کرتے ہوئے کیسا نظر آئے گا:
Stream.of(46, 34, 24, 93, 91, 1, 34, 94)

      .filter(x -> x < 50)

      .map(x -> x + 5)

      .limit(4)

      .forEach(System.out::print);
اسٹریمز کوڈ کی مقدار کو کم کرکے اور اسے مزید پڑھنے کے قابل بنا کر زندگی کو بہت آسان بنا دیتے ہیں۔ ان لوگوں کے لیے جو اس موضوع کو مزید تفصیل سے دیکھنا چاہتے ہیں، یہاں اس موضوع پر ایک اچھا (میں بہترین کہوں گا) مضمون ہے ۔

لیمبڈا

شاید سب سے اہم اور طویل انتظار کی خصوصیت لیمبڈاس کی ظاہری شکل ہے۔ لیمبڈا کیا ہے؟ یہ کوڈ کا ایک بلاک ہے جسے مختلف جگہوں پر منتقل کیا جا سکتا ہے تاکہ اسے بعد میں جتنی بار ضرورت ہو اس پر عمل کیا جا سکے۔ بہت مبہم لگتا ہے، ہے نا؟ سیدھے الفاظ میں، لیمبڈاس کا استعمال کرتے ہوئے، آپ ایک فنکشنل انٹرفیس (ایک گمنام کلاس کے نفاذ کی ایک قسم):
Runnable runnable = () -> { System.out.println("I'm running !");};

new Thread(runnable).start();
ہم نے تیزی سے اور غیر ضروری سرخ ٹیپ کے بغیر run() طریقہ کو نافذ کیا۔ اور ہاں: رن ایبل ایک فعال انٹرفیس ہے۔ میں اسٹریمز کے ساتھ کام کرتے وقت لیمبڈاس کا بھی استعمال کرتا ہوں (جیسا کہ اوپر کی ندیوں والی مثالوں میں)۔ ہم زیادہ گہرائی میں نہیں جائیں گے، چونکہ ہم کافی گہرائی میں غوطہ لگا سکتے ہیں، اس لیے میں چند لنکس چھوڑ دوں گا تاکہ وہ لوگ جو ابھی تک دل کی گہرائیوں میں کھود رہے ہیں وہ مزید گہرائی میں کھود سکیں:

ہر ایک کے لئے

جاوا 8 کے پاس ایک نیا فورچ ہے جو ڈیٹا سٹریم کے ساتھ ایک سٹریم کی طرح کام کرتا ہے۔ یہاں ایک مثال ہے:
List<Integer> someList = Arrays.asList(1, 3, 5, 7, 9);

someList.forEach(x -> System.out.println(x));
(someList.stream().foreach(…)) کے مطابق

طریقہ حوالہ

حوالہ جات کے طریقے ایک نیا، مفید نحو ہے جو موجودہ طریقوں یا جاوا کلاسز یا اشیاء کے کنسٹرکٹرز کا حوالہ دینے کے لیے ڈیزائن کیا گیا ہے بذریعہ :: طریقہ حوالہ جات چار اقسام میں آتے ہیں:
  1. ڈیزائنر سے لنک:

    SomeObject obj = SomeObject::new

  2. جامد طریقہ حوالہ:

    SomeObject::someStaticMethod

  3. کسی خاص قسم کی چیز کے غیر جامد طریقہ کا حوالہ:

    SomeObject::someMethod

  4. کسی مخصوص شے کے باقاعدہ (غیر جامد) طریقہ کا حوالہ

    obj::someMethod

اکثر، طریقہ حوالہ جات لیمبڈاس کے بجائے اسٹریمز میں استعمال کیے جاتے ہیں (حوالہ کے طریقے لیمبڈا سے تیز ہوتے ہیں، لیکن پڑھنے کی اہلیت میں کمتر ہوتے ہیں)۔
someList.stream()

        .map(String::toUpperCase)

      .forEach(System.out::println);
ان لوگوں کے لیے جو حوالہ کے طریقوں پر مزید معلومات چاہتے ہیں:

API کا وقت

تاریخوں اور اوقات کے ساتھ کام کرنے کے لیے ایک نئی لائبریری ہے - java.time۔ 8 سے 13 تک: جاوا ورژنز کا مکمل جائزہ۔  حصہ 1 - 2نیا API کسی بھی جوڈا ٹائم سے ملتا جلتا ہے۔ اس API کے سب سے اہم حصے یہ ہیں:
  • لوکل ڈیٹ ایک مخصوص تاریخ ہے، مثال کے طور پر - 2010-01-09؛
  • لوکل ٹائم - ٹائم زون کو مدنظر رکھتے ہوئے وقت - 19:45:55 (لوکل ڈیٹ کے مطابق)؛
  • لوکل ڈیٹ ٹائم - کامبو لوکل ڈیٹ + لوکل ٹائم - 04-01-2020 15:37:47؛
  • ZoneId - ٹائم زونز کی نمائندگی کرتا ہے؛
  • گھڑی - اس قسم کا استعمال کرتے ہوئے آپ موجودہ وقت اور تاریخ تک رسائی حاصل کرسکتے ہیں۔
یہاں اس موضوع پر چند دلچسپ مضامین ہیں:

اختیاری

یہ java.util پیکیج میں ایک نئی کلاس ہے ، ایک ویلیو ریپر جس کی چال یہ ہے کہ یہ محفوظ طریقے سے null پر مشتمل ہوسکتی ہے ۔ اختیاری وصول کرنا: اگر ہم Optional.ofOptional<String> someOptional = Optional.of("Something"); میں null پاس کرتے ہیں تو ہمیں اپنا پسندیدہ NullPointerException ملے گا ۔ اس طرح کے معاملات میں وہ استعمال کرتے ہیں: - اس طریقہ میں آپ کو null سے ڈرنے کی ضرورت نہیں ہے۔ اس کے بعد، ایک ابتدائی طور پر خالی اختیاری بنائیں: یہ چیک کرنے کے لیے کہ آیا یہ خالی ہے، استعمال کریں: ہمارے پاس صحیح یا غلط واپس آئے گا۔ اگر کوئی قدر ہو تو ایک خاص عمل کریں، اور اگر کوئی قدر نہ ہو تو کچھ نہ کریں: ایک الٹا طریقہ جو پاس شدہ قدر واپس کرتا ہے اگر اختیاری خالی ہے (ایک بیک اپ پلان کی طرح): آپ بہت، بہت طویل وقت تک جاری رکھ سکتے ہیں ( خوش قسمتی سے، اختیاری نے دونوں فراخ ہاتھوں سے طریقے شامل کیے ہیں) لیکن ہم اس پر غور نہیں کریں گے۔ میرے لیے بہتر ہے کہ شروع کرنے والوں کے لیے چند لنکس چھوڑ دوں: Optional<String> someOptional = Optional.ofNullable("Something");Optional<String> someOptional = Optional.empty();someOptional.isPresent();someOptional.ifPresent(System.out::println);System.out.println(someOptional.orElse("Some default content")); ہم نے جاوا 8 میں سب سے مشہور اختراعات کو دیکھا - بس اتنا ہی نہیں ہے۔ اگر آپ مزید جاننا چاہتے ہیں، تو میں آپ کے لیے یہ چھوڑ دیتا ہوں:

جاوا 9

لہذا، 21 ستمبر 2017 کو، دنیا نے JDK 9 دیکھا۔ یہ Java 9 خصوصیات کے بھرپور سیٹ کے ساتھ آتا ہے۔ اگرچہ زبان کے کوئی نئے تصورات نہیں ہیں، نئے APIs اور تشخیصی کمانڈز یقینی طور پر ڈویلپرز کے لیے دلچسپی کا باعث ہوں گے۔ 8 سے 13 تک: جاوا ورژنز کا مکمل جائزہ۔  حصہ 1 - 4

JShell (REPL - read-eval-print loop)

یہ ایک انٹرایکٹو کنسول کا جاوا نفاذ ہے جو فنکشنلٹی کو جانچنے اور کنسول میں مختلف تعمیرات جیسے انٹرفیس، کلاسز، اینوم، آپریٹرز وغیرہ استعمال کرنے کے لیے استعمال ہوتا ہے۔ JShell شروع کرنے کے لیے ، آپ کو ٹرمینل میں صرف jshell لکھنے کی ضرورت ہے۔ پھر ہم جو کچھ بھی ہماری تخیل کی اجازت دیتا ہے لکھ سکتے ہیں: 8 سے 13 تک: جاوا ورژنز کا مکمل جائزہ۔  حصہ 1 - 5JShell کا استعمال کرتے ہوئے، آپ اعلیٰ سطح کے طریقے بنا سکتے ہیں اور انہیں اسی سیشن میں استعمال کر سکتے ہیں۔ یہ طریقے جامد طریقوں کی طرح کام کریں گے، سوائے اس کے کہ جامد مطلوبہ الفاظ کو چھوڑ دیا جائے۔ Java 9 REPL (JShell) مینوئل میں مزید پڑھیں ۔

نجی

جاوا کے ورژن 9 سے شروع کرتے ہوئے، ہمارے پاس انٹرفیس میں نجی طریقے استعمال کرنے کا موقع ہے (پہلے سے طے شدہ اور جامد طریقے، کیونکہ ناکافی رسائی کی وجہ سے ہم دوسروں کو اوور رائڈ نہیں کر سکتے)۔ private static void someMethod(){} try-with-resources Try-with-Resources کے استثناء کو ہینڈل کرنے کی صلاحیت کو اپ گریڈ کر دیا گیا ہے:
BufferedReader reader = new BufferedReader(new FileReader("....."));
  try (reader2) {
  ....
}

ماڈیولرٹی ( Jigsaw )

ایک ماڈیول ایک نئی ماڈیول ڈسکرپٹر فائل کے ساتھ متعلقہ پیکیجز اور وسائل کا ایک گروپ ہے۔ یہ نقطہ نظر کوڈ کے جوڑے کو ڈھیلا کرنے کے لیے استعمال کیا جاتا ہے۔ کوڈ کو برقرار رکھنے اور توسیع پذیری کے لیے ڈھیلا جوڑا ایک کلیدی عنصر ہے۔ ماڈیولریٹی کو مختلف سطحوں پر لاگو کیا جاتا ہے:
  1. پروگرامنگ زبان.
  2. ورچوئل مشین۔
  3. معیاری جاوا API۔
JDK 9 92 ماڈیولز کے ساتھ آتا ہے: ہم انہیں استعمال کر سکتے ہیں یا خود بنا سکتے ہیں۔ گہرائی سے دیکھنے کے لیے چند لنکس یہ ہیں:

ناقابل تغیر مجموعہ

جاوا 9 میں، ایک لائن کے ساتھ مجموعہ بنانا اور پُر کرنا ممکن ہو گیا، جبکہ اسے ناقابل تغیر بناتے ہوئے (پہلے، ایک ناقابل تغیر مجموعہ بنانے کے لیے، ہمیں ایک مجموعہ بنانے، اسے ڈیٹا سے پُر کرنے، اور ایک طریقہ کو کال کرنے کی ضرورت تھی، مثال کے طور پر، Collections.unmodifiableList)۔ ایسی تخلیق کی ایک مثال: List someList = List.of("first","second","third");

دیگر اختراعات:

  • توسیع شدہ اختیاری (نئے طریقے شامل کیے گئے)؛
  • ProcessHandle اور ProcessHandle انٹرفیس آپریٹنگ سسٹم کے اعمال کو کنٹرول کرنے کے لیے ظاہر ہوئے؛
  • G1 - پہلے سے طے شدہ کوڑا اٹھانے والا؛
  • HTTP/2 پروٹوکول اور WebSocket دونوں کے لیے سپورٹ کے ساتھ HTTP کلائنٹ؛
  • توسیع شدہ سلسلہ؛
  • Reactive Streams API فریم ورک شامل کیا گیا (ری ایکٹو پروگرامنگ کے لیے)؛
جاوا 9 میں مزید مکمل وسرجن کے لیے، میں آپ کو پڑھنے کا مشورہ دیتا ہوں:

جاوا 10

لہذا، جاوا 9 کی ریلیز کے چھ ماہ بعد، مارچ 2018 میں (مجھے کل کی طرح یاد ہے)، جاوا 10 منظرعام پر آیا۔ 8 سے 13 تک: جاوا ورژنز کا مکمل جائزہ۔  حصہ 1 - 6

var

اب ہمیں ڈیٹا کی قسم فراہم کرنے کی ضرورت نہیں ہے۔ ہم پیغام کو var کے طور پر نشان زد کرتے ہیں اور مرتب کرنے والا پیغام کی قسم کا تعین دائیں جانب موجود انیشیلائزر کی قسم سے کرتا ہے۔ یہ خصوصیت صرف مقامی متغیرات کے لیے دستیاب ہے جس میں ابتدائیہ ہے: اسے طریقہ کار کے دلائل، واپسی کی اقسام، وغیرہ کے لیے استعمال نہیں کیا جا سکتا، کیونکہ قسم کی وضاحت کرنے کے لیے کوئی انیشیلائزر نہیں ہے۔ مثال var (ٹائپ سٹرنگ کے لیے):
var message = "Some message…..";
System.out.println(message);
var کلیدی لفظ نہیں ہے: یہ بنیادی طور پر ایک مخصوص قسم کا نام ہے، بالکل int کی طرح ۔ var کا فائدہ بہت اچھا ہے: قسم کے اعلانات کوئی فائدہ لائے بغیر بہت زیادہ توجہ دیتے ہیں، اور یہ خصوصیت وقت کی بچت کرے گی۔ لیکن ایک ہی وقت میں، اگر طریقوں کی ایک لمبی زنجیر سے ایک متغیر حاصل کیا جائے تو، کوڈ کم پڑھنے کے قابل ہو جاتا ہے، کیونکہ یہ فوری طور پر واضح نہیں ہوتا ہے کہ وہاں کس قسم کی چیز موجود ہے۔ ان لوگوں کے لیے وقف ہے جو اس فعالیت سے زیادہ واقف ہونا چاہتے ہیں:

JIT مرتب کرنے والا (GraalVM)

مزید اڈو کے بغیر، میں آپ کو یاد دلاتا ہوں کہ جب آپ javac کمانڈ چلاتے ہیں، تو جاوا ایپلیکیشن جاوا کوڈ سے JVM بائیک کوڈ میں مرتب ہوتی ہے، جو کہ ایپلی کیشن کی بائنری نمائندگی ہے۔ لیکن ایک باقاعدہ کمپیوٹر پروسیسر صرف JVM بائیک کوڈ پر عمل نہیں کر سکتا۔ آپ کے JVM پروگرام کے کام کرنے کے لیے، آپ کو اس بائیک کوڈ کے لیے ایک اور کمپائلر کی ضرورت ہے، جو مشین کوڈ میں تبدیل ہو جائے جسے پروسیسر پہلے ہی استعمال کرنے کے قابل ہو۔ javac کے مقابلے میں، یہ کمپائلر بہت زیادہ پیچیدہ ہے، لیکن یہ اعلیٰ معیار کا مشین کوڈ بھی تیار کرتا ہے۔ فی الحال، OpenJDK میں HotSpot ورچوئل مشین ہے، جس کے نتیجے میں دو اہم JIT کمپائلر ہیں۔ پہلا، C1 ( کلائنٹ کمپائلر )، تیز رفتار آپریشن کے لیے ڈیزائن کیا گیا ہے، لیکن کوڈ کی اصلاح کا سامنا کرنا پڑتا ہے۔ دوسرا C2 (سرور کمپائلر) ہے۔ عملدرآمد کی رفتار کا سامنا کرنا پڑتا ہے، لیکن کوڈ زیادہ بہتر ہے. کون سا کب استعمال ہوتا ہے؟ C1 ڈیسک ٹاپ ایپلی کیشنز کے لیے بہت اچھا ہے جہاں طویل JIT توقف ناپسندیدہ ہے، اور C2 طویل عرصے سے چلنے والے سرور پروگراموں کے لیے بہترین ہے جہاں تالیف پر زیادہ وقت گزارنا کافی قابل برداشت ہے۔ کثیر سطحی تالیف تب ہوتی ہے جب تالیف پہلے C1 سے گزرتی ہے، اور نتیجہ C2 (زیادہ سے زیادہ اصلاح کے لیے استعمال ہوتا ہے) سے گزرتا ہے۔ GraalVM ہاٹ سپاٹ کو مکمل طور پر تبدیل کرنے کے لیے بنایا گیا ایک پروجیکٹ ہے۔ ہم Graal کے بارے میں کئی متعلقہ پروجیکٹس کے طور پر سوچ سکتے ہیں: ہاٹ سپاٹ کے لیے ایک نیا JIT کمپائلر اور ایک نئی پولی گلوٹ ورچوئل مشین۔ اس جے آئی ٹی کمپائلر کی خاصیت یہ ہے کہ یہ جاوا میں لکھا گیا ہے۔ Graal کمپائلر کا فائدہ حفاظت ہے، یعنی کریش نہیں، لیکن استثناء، میموری لیک نہیں ہے۔ ہمارے پاس اچھی IDE سپورٹ بھی ہو گی، اور ہم ڈیبگرز، پروفائلرز یا دیگر آسان ٹولز استعمال کر سکیں گے۔ اس کے علاوہ، کمپائلر HotSpot سے آزاد ہو سکتا ہے، اور یہ خود کا ایک تیز تر JIT-مرتب شدہ ورژن بنانے کے قابل ہو گا۔ کھودنے والوں کے لیے:

متوازی G1

G1 کوڑا اٹھانے والا ٹھنڈا ہے، اس میں کوئی شک نہیں، لیکن اس کا ایک کمزور نقطہ بھی ہے: یہ واحد تھریڈڈ مکمل GC سائیکل انجام دیتا ہے۔ ایسے وقت میں جب آپ کو ہارڈ ویئر کی تمام طاقت کی ضرورت ہوتی ہے جسے آپ غیر استعمال شدہ اشیاء کو تلاش کرنے کے لیے جمع کر سکتے ہیں، ہم صرف ایک دھاگے تک محدود ہیں۔ یہ جاوا 10 میں طے کیا گیا تھا۔ اب جی سی اب ان تمام وسائل کے ساتھ کام کرتا ہے جو ہم اس میں شامل کرتے ہیں (یعنی یہ ملٹی تھریڈ ہو جاتا ہے)۔ اس کو حاصل کرنے کے لیے، لینگویج ڈویلپرز نے GC سے اہم ماخذ کی الگ تھلگ کو بہتر بنایا ہے، جس سے GC کے لیے ایک صاف ستھرا انٹرفیس بنایا گیا ہے۔ اس خوبصورتی کے ڈویلپرز، OpenJDK، کو خاص طور پر کوڈ میں موجود ڈمپ کو صاف کرنا پڑا تاکہ نہ صرف نئے GCs کی تخلیق کو زیادہ سے زیادہ آسان بنایا جا سکے، بلکہ اسمبلی سے غیر ضروری GCs کو فوری طور پر غیر فعال کرنا بھی ممکن بنایا جا سکے۔ کامیابی کا ایک اہم معیار ان تمام بہتریوں کے بعد آپریٹنگ اسپیڈ میں کمی کی عدم موجودگی ہے۔ آئیے یہ بھی دیکھتے ہیں: دیگر اختراعات:
  1. ایک صاف کچرا جمع کرنے والا انٹرفیس متعارف کرایا گیا ہے۔ یہ مختلف کوڑا اٹھانے والوں سے سورس کوڈ کی الگ تھلگ کو بہتر بناتا ہے، جس سے متبادل جمع کرنے والوں کو جلدی اور بغیر تکلیف کے انضمام کرنا ممکن ہو جاتا ہے۔
  2. JDK ذرائع کو ایک ذخیرہ میں ملانا؛
  3. مجموعوں کو ایک نیا طریقہ موصول ہوا - copyOf (مجموعہ) ، جو اس مجموعہ کی ایک ناقابل تغیر کاپی واپس کرتا ہے۔
  4. اختیاری (اور اس کی مختلف حالتوں) کا ایک نیا طریقہ ہے .orElseThrow() ;
  5. اب سے، JVMs کو معلوم ہے کہ وہ ڈوکر کنٹینر میں چل رہے ہیں اور خود آپریٹنگ سسٹم سے استفسار کرنے کے بجائے کنٹینر کے لیے مخصوص کنفیگریشن کو بازیافت کریں گے۔
جاوا 10 کے مزید تفصیلی تعارف کے لیے کچھ اور مواد یہ ہیں: میں اس حقیقت سے بہت الجھا ہوا تھا کہ جاوا کے کچھ ورژن کو 1.x کہا جاتا ہے۔ میں واضح ہونا چاہوں گا: 9 سے پہلے کے جاوا ورژن میں صرف ایک مختلف نام کی اسکیم تھی۔ مثال کے طور پر، جاوا 8 کو 1.8 ، Java 5 - 1.5 ، وغیرہ بھی کہا جا سکتا ہے ۔ اور اب ہم دیکھتے ہیں کہ Java 9 سے ریلیز میں منتقلی کے ساتھ، نام دینے کی اسکیم بھی بدل گئی ہے، اور جاوا ورژن اب 1.x کے ساتھ سابقہ ​​نہیں ہیں۔ . یہ پہلے حصے کا اختتام ہے: ہم نے جاوا 8-10 کی نئی دلچسپ خصوصیات کو دیکھا۔ آئیے اگلی پوسٹ میں تازہ ترین سے اپنی واقفیت جاری رکھیں ۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION