আমি জাভাতে একটি বেনামে কীভাবে লিখতে পারি?


উত্তর:


81

আপনি যদি কোনও বেনামি ফাংশন বোঝাতে চান এবং জাভা 8 এর আগে জাভাটির কোনও সংস্করণ ব্যবহার করছেন তবে কোনও কথায়, না। ( আপনি জাভা 8+ ব্যবহার করলে ল্যাম্বডা এক্সপ্রেশন সম্পর্কে পড়ুন )

যাইহোক, আপনি এর মতো একটি ফাংশন সহ একটি ইন্টারফেস প্রয়োগ করতে পারেন:

Comparator<String> c = new Comparator<String>() {
    int compare(String s, String s2) { ... }
};

এবং আপনি এটি প্রায় বেনামে ফাংশন পেতে অভ্যন্তরীণ ক্লাসগুলির সাথে ব্যবহার করতে পারেন :)


6
এখনো পর্যন্ত না. : জাভা 7 এ এটা সম্ভব হতে যাচ্ছে stackoverflow.com/questions/233579/closures-in-java-7
ইলিয়া Boyandin

4
ইতিমধ্যে, যখন JDK7 অপেক্ষায় বেনামী পদ্ধতি একটি OO যেমন পণ্য প্রেক্ষাপটে ব্যবহার emulated করা যেতে পারে en.wikipedia.org/wiki/Command_pattern
gpampara

4
ক্লোজড এটি জাভা into তে পরিণত করতে পারেনি
অ্যান্ডারসন

4
আমি মনে করি জাভা 8
থাকায়

45

এখানে বেনামে অভ্যন্তর শ্রেণির উদাহরণ'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দৈর্ঘ্যের ক্ষেত্রে )।

আরো দেখুন


4
EventListenerগড় অন্য সুইং অ্যাপ্লিকেশনটিতে (উপ) প্রয়োগ হিসাবে বেশিরভাগ অন্যরকম উপস্থিতি পাওয়া যায় ।
বালুসসি

@ বালুসসি: "তারা কীভাবে ব্যবহার করা হয়" এই প্রশ্নের সাথে যুক্ত লিঙ্ক
পলিজেনব্রিকেন্টস

@ বালুসসি: স্ট্যাকওভারফ্লো সম্প্রতি সাইডবারটি যুক্ত করেছে Linked, তাই এটির ব্যবহারের জন্য আমি যথাসাধ্য চেষ্টা করছি।
বহুবৃত্তীয় পদার্থ

12

জাভা 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);

আরও বিস্তারিত তথ্যের জন্য ল্যাম্বদা এক্সপ্রেশন টিউটোরিয়ালটি দেখুন


4
পদ্ধতির উল্লেখগুলিও কার্যকর useful উদাহরণস্বরূপ (স্ট্রিং :: তুলনাToIgnoreCase) দস্তাবেজ.অরাকল.com
জোশিয়াহ

9

অজ্ঞাতনামা অভ্যন্তরীণ শ্রেণিগুলি একটি বিদ্যমান ধরণের ইন্টারফেস বাস্তবায়ন বা প্রসারিত করা অন্যান্য উত্তরে করা হয়েছে, যদিও একাধিক পদ্ধতি প্রয়োগ করা যেতে পারে তা লক্ষণীয় (উদাহরণস্বরূপ জাভাবিয়ান-শৈলীর ইভেন্টগুলির সাথে)।

কিছুটা স্বীকৃত বৈশিষ্ট্য হ'ল বেনামে অভ্যন্তর শ্রেণীর নাম না থাকলেও তাদের একটি প্রকার রয়েছে। ইন্টারফেসে নতুন পদ্ধতি যুক্ত করা যেতে পারে। এই পদ্ধতিগুলি কেবল সীমিত ক্ষেত্রেই ডাকা যাবে। প্রধানত সরাসরি 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" স্থানীয়দের? )


nodefinalএখানে ঘোষণা করা উচিত ।
বালুসসি

পছন্দ করুন আসলে আমার ভুলটি ব্যবহার করা হয়নি cur
টম হাটিন -

@ টম: +1 দুর্দান্ত কৌশল! এটি আসলে অনুশীলনের কোথাও ব্যবহৃত হয়? এই নির্দিষ্ট প্যাটার্নটির কোনও নাম?
বহুজেন্দ্রিক্রেন্টস 3:51

আমি জানি যতটা না জানি পুরো অতিরিক্ত জিনিস খরচ! (এবং একটি বর্গ।) ডাবল ব্রেস মূর্তিগুলির ক্ষেত্রেও একই ঘটনা ঘটে। সঠিক চিন্তাভাবনা লোকেরা প্রায়শই এক্সিকিউট আউটড আইডিয়ামটি মনে করবে না।
টম হাটিন -

@ পলিজেলেনব্রিকেন্টস আসলে আমার মনে হয় না যে অনেকগুলি (স্বনির্ভর) পুনরাবৃত্ত আলগোরিদিমগুলি। বিশেষত যারা পুচ্ছ-পুনরাবৃত্ত হয় না (বা সহজেই তৈরি করা হয়) এবং পাবলিক পদ্ধতিতে কল করে প্রয়োগ করা যায় না ( "Node" +দ্বিতীয় পদ্ধতিটি প্রয়োজনীয় করার জন্য কিছুটা অপ্রাসঙ্গিক নোট করুন )। / আমার নাম নেই সম্ভবত আমি একটি নামকরণ "পোল" (সিডাব্লু) প্রশ্ন তৈরি করতে পেরেছিলাম এবং এটিকে বিস্মৃত হতে চেয়েছিলাম।
টম হাটিন -

1

হ্যাঁ আপনি যদি সর্বশেষতম জাভা ব্যবহার করছেন যা সংস্করণ ৮। যা জাভা 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অপারেটর
  • প্রয়োগ করার জন্য একটি ইন্টারফেসের নাম বা প্রসারিত করার জন্য একটি শ্রেণীর। এই উদাহরণে, বেনাম শ্রেণি হ্যালো ওয়ার্ল্ড ইন্টারফেসটি প্রয়োগ করছে।

  • কোনও সাধারণ শ্রেণীর উদাহরণ তৈরির মত প্রকাশের মতোই কোনও কনস্ট্রাক্টরের সাথে যুক্তি যুক্ত প্যারেন্টিসেস। দ্রষ্টব্য: আপনি যখন কোনও ইন্টারফেস বাস্তবায়ন করেন তখন কোনও নির্মাণকারী থাকে না, তাই আপনি খালি জোড়া বন্ধনী ব্যবহার করেন, যেমন এই উদাহরণ হিসাবে।

  • একটি দেহ, যা একটি শ্রেণিবদ্ধকরণ সংস্থা। আরও নির্দিষ্টভাবে, শরীরে, পদ্ধতি ঘোষণার অনুমতি রয়েছে তবে বিবৃতি দেওয়া হয় না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.