জাভা 8-তে নতুন ল্যাম্বডে সংকেত (যেমন এই নিবন্ধটি দেখুন ) প্রবর্তনের জন্য কোনও প্রকারের অনুক্রমের প্রয়োজন হবে?
যদি তা হয় তবে নতুন টাইপ সিস্টেমটি কীভাবে পুরো জাভা ভাষায় প্রভাব ফেলবে?
জাভা 8-তে নতুন ল্যাম্বডে সংকেত (যেমন এই নিবন্ধটি দেখুন ) প্রবর্তনের জন্য কোনও প্রকারের অনুক্রমের প্রয়োজন হবে?
যদি তা হয় তবে নতুন টাইপ সিস্টেমটি কীভাবে পুরো জাভা ভাষায় প্রভাব ফেলবে?
উত্তর:
র্যাচেট ফ্রিকের জবাব এবং এর মন্তব্যের সুত্রটিতে মোটামুটি ভুল তথ্য রয়েছে । আমি এখানে একটি উত্তরে প্রতিক্রিয়া জানাবো, যেহেতু একটি মন্তব্য খুব ছোট। এছাড়াও, যেহেতু এটি সর্বোপরি একটি উত্তর, আমি মূল প্রশ্নেরও উত্তর দেওয়ার চেষ্টা করব। (তবে লক্ষ করুন যে আমি টাইপ সিস্টেমে বিশেষজ্ঞ নই।)
প্রথমত, মূল প্রশ্নের সংক্ষিপ্ত উত্তর হ্যাঁ এবং হ্যাঁ, হ্যাঁ, জাভা 8-তে জাভা than-এর চেয়ে উল্লেখযোগ্যভাবে আরও বেশি টাইপ হবে এবং জাভা 8-তে "নতুন" টাইপ সিস্টেম নেই, যদিও কিছু ছোটখাটো পরিবর্তন রয়েছে ।
জাভা 8 এখনও স্থিরভাবে টাইপ করা হবে এবং এটি এখনও ক্লাস এবং ইন্টারফেসের মধ্যে দ্বৈতত্ত্ব থাকবে। কোনও নতুন ধরণের যেমন ফাংশন ধরণের নেই। ল্যাম্বডার ধরণটি মূলত একটি "ফাংশনাল ইন্টারফেস" যা একক বিমূর্ত পদ্ধতি সহ একটি সাধারণ ইন্টারফেস।
ইন্টারফেসের এখন ডিফল্ট পদ্ধতিগুলির আকারে কোড থাকতে পারে তবে শ্রেণির একক-উত্তরাধিকার এবং ইন্টারফেসের একাধিক উত্তরাধিকারের মডেল একই রয়েছে। অবশ্যই কিছু সমন্বয় রয়েছে যেমন ডিফল্ট পদ্ধতির উপস্থিতিতে পদ্ধতি সমাধানের নিয়ম, তবে মৌলিকাগুলি অপরিবর্তিত থাকে।
টাইপ অনুমান দ্বারা অনুমান করা যে কোনও প্রকারের স্পষ্টভাবে লেখা যেতে পারে। র্যাচেট ফ্রিকের উদাহরণ ব্যবহার করতে ,
Collections.<MyClass>sort(list, (a, b) -> { return a.order - b.order; });
মূলত চিনি জন্য
Collections.<MyClass>sort(list,
(Comparator<MyClass>)((MyClass a, MyClass b) -> { return a.order - b.order; }));
সুতরাং স্পার্কলশির বক্তব্য "টাইপ অনুক্রমের জন্য টাইপ সিস্টেমের কোনও প্রসারণ প্রয়োজন হয় না" মূলত সঠিক।
তবে সিনট্যাকটিক চিনিতে ফিরে যাওয়ার জন্য, আমি আমার বক্তব্যটি পুনরাবৃত্তি করব যে একটি বেনামি অভ্যন্তর শ্রেণীর জন্য ল্যাম্বডা এক্সপ্রেশনটি সিনট্যাকটিক চিনি নয়। র্যাচিট খামখেয়াল বিবৃত করে একটি ল্যামডা অভিব্যক্তি একটি বেনামী ভেতরের বর্গ ইনস্ট্যান্স অনুদিত হয়, এবং Sparkleshy কেবল পুনরুদ্ধার করে একটি ল্যামডা হয় একটি বেনামী ভেতরের বর্গ জন্য অন্বিত চিনি, কিন্তু এই বিবৃতি ভুল। তারা সম্ভবত পুরানো তথ্যের উপর ভিত্তি করে। শুরুর ল্যাম্বদা বাস্তবায়নগুলি এভাবে ল্যাম্বডাস বাস্তবায়িত করেছিল, তবে জিনিসগুলি পরিবর্তিত হয়েছে।
ল্যাম্বডা এক্সপ্রেশনগুলি আন্তঃ শ্রেণীর থেকে শব্দার্থগতভাবে পৃথক, এবং সেগুলি অভ্যন্তর শ্রেণীর চেয়ে পৃথকভাবে প্রয়োগ করা হয়।
ল্যাম্বদা এক্সপ্রেশন দুটি উপায়ে আন্তঃ শ্রেণীর থেকে শব্দার্থগতভাবে পৃথক। ল্যাম্বডা এক্সপ্রেশন মূল্যায়নের জন্য প্রতিবার একটি নতুন উদাহরণ তৈরি করার দরকার নেই। তাদের পৃথক ক্যাপচার শব্দার্থবিজ্ঞানও রয়েছে, উদাহরণস্বরূপ, তারা এটিকে অন্যভাবে ক্যাপচার করে । ইনার বর্গ ইন, এই ভেতরের বর্গ উদাহরণস্বরূপ, একটি ল্যামডা মধ্যে যেহেতু, এই এনক্লোজিং উদাহরণ। নিম্নোক্ত বিবেচনা কর:
public class CaptureThis {
void a(Runnable r) { r.run(); }
void b() {
a(new Runnable() { public void run() { System.out.println(this); }});
a(() -> System.out.println(this));
}
public String toString() { return "outer"; }
public static void main(String[] args) { new CaptureThis().b(); }
}
সাম্প্রতিক জেডিকে 8 ল্যাম্বদা বিল্ডে (আমি বি 69 ব্যবহার করেছি ), আউটপুটটি নীচের মতো হবে:
CaptureThis$1@113de03
outer
তদতিরিক্ত, ল্যাম্বডা এক্সপ্রেশনগুলি অভ্যন্তর শ্রেণীর থেকে সম্পূর্ণ আলাদাভাবে প্রয়োগ করা হয়। যদি আপনি বিচ্ছিন্ন আউটপুটটির তুলনা করেন, আপনি দেখতে পাবেন যে অভ্যন্তরীণ শ্রেণি কোডটি সরাসরি তৈরি করার জন্য সংকলন করে এবং ক্যাপচারটি 1 of 1 এর নির্মাতাকে কল করে, যেখানে ল্যাম্বডা এক্সপ্রেশনটি একটি চালিতযোগ্য নির্দেশের সাথে সংমিশ্রণ করে যা রান্নেবলকে অনির্ধারিত মাধ্যমে আবিষ্কার করে। এটি কীভাবে এবং কেন কাজ করে তার পুরো ব্যাখ্যার জন্য, ব্রায়ান গোয়েটসের জাভাওন 2012 টক ল্যাম্বদা: দ্য হুডের নীচে দেখুন ।
this
সঙ্গেMyClass.this