এটা কি সম্ভব?
উত্তর:
আপনি যদি কোনও বেনামি ফাংশন বোঝাতে চান এবং জাভা 8 এর আগে জাভাটির কোনও সংস্করণ ব্যবহার করছেন তবে কোনও কথায়, না। ( আপনি জাভা 8+ ব্যবহার করলে ল্যাম্বডা এক্সপ্রেশন সম্পর্কে পড়ুন )
যাইহোক, আপনি এর মতো একটি ফাংশন সহ একটি ইন্টারফেস প্রয়োগ করতে পারেন:
Comparator<String> c = new Comparator<String>() {
int compare(String s, String s2) { ... }
};
এবং আপনি এটি প্রায় বেনামে ফাংশন পেতে অভ্যন্তরীণ ক্লাসগুলির সাথে ব্যবহার করতে পারেন :)
এখানে বেনামে অভ্যন্তর শ্রেণির উদাহরণ's
System.out.println(new Object() {
@Override public String toString() {
return "Hello world!";
}
}); // prints "Hello world!"
এটি যেমনটি তেমন কার্যকর নয় তবে এটি বেনামে অভ্যন্তর শ্রেণীর একটি উদাহরণ কীভাবে তৈরি করতে হয় তা extends Object
এবং @Override
তার toString()
পদ্ধতিটি এটি দেখায় ।
অজ্ঞাতনামা অভ্যন্তরীণ ক্লাসগুলি খুব সহজেই কার্যকর হয় যখন আপনি এমন একটি প্রয়োগ interface
করতে হবে যা সম্ভবত পুনরায় ব্যবহারযোগ্য না হয় (এবং সেইজন্য তার নিজস্ব নামযুক্ত শ্রেণীর কাছে পুনরুদ্ধার করার উপযুক্ত নয়)। java.util.Comparator<T>
বাছাইয়ের জন্য একটি শিক্ষামূলক উদাহরণ ব্যবহার করা হচ্ছে ।
আপনি কীভাবে কোনও String[]
ভিত্তিতে বাছাই করতে পারেন তার একটি উদাহরণ এখানে String.length()
।
import java.util.*;
//...
String[] arr = { "xxx", "cd", "ab", "z" };
Arrays.sort(arr, new Comparator<String>() {
@Override public int compare(String s1, String s2) {
return s1.length() - s2.length();
}
});
System.out.println(Arrays.toString(arr));
// prints "[z, cd, ab, xxx]"
এখানে ব্যবহৃত তুলনা-বিয়োগ বিয়োগ দ্রষ্টব্য। এটি বলা উচিত যে এই কৌশলটি সাধারণভাবে ভেঙে গেছে: এটি কেবল তখনই প্রযোজ্য যখন আপনি গ্যারান্টি দিতে পারবেন যে এটি উপচে পড়বে না (যেমন String
দৈর্ঘ্যের ক্ষেত্রে )।
EventListener
গড় অন্য সুইং অ্যাপ্লিকেশনটিতে (উপ) প্রয়োগ হিসাবে বেশিরভাগ অন্যরকম উপস্থিতি পাওয়া যায় ।
Linked
, তাই এটির ব্যবহারের জন্য আমি যথাসাধ্য চেষ্টা করছি।
জাভা 8-এ ল্যাম্বডা এক্সপ্রেশন প্রবর্তনের সাথে সাথে আপনি এখন বেনামে পদ্ধতি রাখতে পারেন।
বলুন আমার একটি ক্লাস আছে Alpha
এবং আমি Alpha
একটি নির্দিষ্ট শর্তে এস ফিল্টার করতে চাই । এটি করতে আপনি একটি ব্যবহার করতে পারেন Predicate<Alpha>
। এটি একটি কার্যকরী ইন্টারফেস যা একটি পদ্ধতি test
গ্রহণ করে যা একটি গ্রহণ করে Alpha
এবং a প্রদান করে boolean
।
ধরে নিই যে ফিল্টার পদ্ধতিতে এই স্বাক্ষর রয়েছে:
List<Alpha> filter(Predicate<Alpha> filterPredicate)
পুরানো বেনাম শ্রেণীর সমাধানের সাথে আপনার এমন কিছু দরকার হবে:
filter(new Predicate<Alpha>() {
boolean test(Alpha alpha) {
return alpha.centauri > 1;
}
});
জাভা 8 ল্যাম্বডাসের সাহায্যে আপনি এটি করতে পারেন:
filter(alpha -> alpha.centauri > 1);
আরও বিস্তারিত তথ্যের জন্য ল্যাম্বদা এক্সপ্রেশন টিউটোরিয়ালটি দেখুন
অজ্ঞাতনামা অভ্যন্তরীণ শ্রেণিগুলি একটি বিদ্যমান ধরণের ইন্টারফেস বাস্তবায়ন বা প্রসারিত করা অন্যান্য উত্তরে করা হয়েছে, যদিও একাধিক পদ্ধতি প্রয়োগ করা যেতে পারে তা লক্ষণীয় (উদাহরণস্বরূপ জাভাবিয়ান-শৈলীর ইভেন্টগুলির সাথে)।
কিছুটা স্বীকৃত বৈশিষ্ট্য হ'ল বেনামে অভ্যন্তর শ্রেণীর নাম না থাকলেও তাদের একটি প্রকার রয়েছে। ইন্টারফেসে নতুন পদ্ধতি যুক্ত করা যেতে পারে। এই পদ্ধতিগুলি কেবল সীমিত ক্ষেত্রেই ডাকা যাবে। প্রধানত সরাসরি new
প্রকাশের উপর এবং শ্রেণীর মধ্যে (উদাহরণস্বরূপ প্রাথমিক) including এটি প্রাথমিকভাবে বিভ্রান্ত হতে পারে, তবে এটি পুনরাবৃত্তির জন্য "আকর্ষণীয়" হতে পারে।
private static String pretty(Node node) {
return "Node: " + new Object() {
String print(Node cur) {
return cur.isTerminal() ?
cur.name() :
("("+print(cur.left())+":"+print(cur.right())+")");
}
}.print(node);
}
(আমি মূলত এটি ব্যবহার লিখেছিলেন node
বদলে cur
মধ্যে print
পদ্ধতি। ক্যাপচার "পরোক্ষভাবে করতে বলো না final
" স্থানীয়দের? )
node
final
এখানে ঘোষণা করা উচিত ।
cur
।
"Node" +
দ্বিতীয় পদ্ধতিটি প্রয়োজনীয় করার জন্য কিছুটা অপ্রাসঙ্গিক নোট করুন )। / আমার নাম নেই সম্ভবত আমি একটি নামকরণ "পোল" (সিডাব্লু) প্রশ্ন তৈরি করতে পেরেছিলাম এবং এটিকে বিস্মৃত হতে চেয়েছিলাম।
হ্যাঁ আপনি যদি সর্বশেষতম জাভা ব্যবহার করছেন যা সংস্করণ ৮। যা জাভা 8 বেনামে কার্যকারিতা সংজ্ঞায়িত করা সম্ভব করে তোলে যা পূর্ববর্তী সংস্করণগুলিতে অসম্ভব ছিল।
আমরা কীভাবে বেনাম ফাংশন, ক্লাস ঘোষণা করতে পারি তা জানতে জাভা ডক্সের উদাহরণ নিতে দিন
নিম্নলিখিত উদাহরণটি, হ্যালোওয়ার্ল্ড অজ্ঞাতনামা ক্লাসগুলি স্থানীয় ভেরিয়েবল ফ্রেঞ্চগ্রিটিং এবং স্প্যানিশ গ্রিটিংয়ের সূচনা বিবরণীতে বেনাম ক্লাস ব্যবহার করে, তবে পরিবর্তনশীল ইংরাজীকরণের সূচনা করার জন্য স্থানীয় শ্রেণি ব্যবহার করে:
public class HelloWorldAnonymousClasses {
interface HelloWorld {
public void greet();
public void greetSomeone(String someone);
}
public void sayHello() {
class EnglishGreeting implements HelloWorld {
String name = "world";
public void greet() {
greetSomeone("world");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hello " + name);
}
}
HelloWorld englishGreeting = new EnglishGreeting();
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
HelloWorld spanishGreeting = new HelloWorld() {
String name = "mundo";
public void greet() {
greetSomeone("mundo");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Hola, " + name);
}
};
englishGreeting.greet();
frenchGreeting.greetSomeone("Fred");
spanishGreeting.greet();
}
public static void main(String... args) {
HelloWorldAnonymousClasses myApp =
new HelloWorldAnonymousClasses();
myApp.sayHello();
}
}
বেনাম শ্রেণীর সিনট্যাক্স
ফরাসী গ্রিটিটিং অবজেক্টের ইনস্ট্যান্টেশন বিবেচনা করুন:
HelloWorld frenchGreeting = new HelloWorld() {
String name = "tout le monde";
public void greet() {
greetSomeone("tout le monde");
}
public void greetSomeone(String someone) {
name = someone;
System.out.println("Salut " + name);
}
};
বেনাম শ্রেণীর প্রকাশের সাথে নিম্নলিখিতটি রয়েছে:
new
অপারেটরপ্রয়োগ করার জন্য একটি ইন্টারফেসের নাম বা প্রসারিত করার জন্য একটি শ্রেণীর। এই উদাহরণে, বেনাম শ্রেণি হ্যালো ওয়ার্ল্ড ইন্টারফেসটি প্রয়োগ করছে।
কোনও সাধারণ শ্রেণীর উদাহরণ তৈরির মত প্রকাশের মতোই কোনও কনস্ট্রাক্টরের সাথে যুক্তি যুক্ত প্যারেন্টিসেস। দ্রষ্টব্য: আপনি যখন কোনও ইন্টারফেস বাস্তবায়ন করেন তখন কোনও নির্মাণকারী থাকে না, তাই আপনি খালি জোড়া বন্ধনী ব্যবহার করেন, যেমন এই উদাহরণ হিসাবে।
একটি দেহ, যা একটি শ্রেণিবদ্ধকরণ সংস্থা। আরও নির্দিষ্টভাবে, শরীরে, পদ্ধতি ঘোষণার অনুমতি রয়েছে তবে বিবৃতি দেওয়া হয় না।