java - কিভাবে বেনামী ক্লাস পরামিতি পাস?




anonymous-class (10)

আমার সমাধান একটি পদ্ধতি ব্যবহার করা হয় যা প্রয়োগকৃত বেনামী ক্লাসটি ফেরত দেয়। নিয়মিত আর্গুমেন্ট পদ্ধতিতে পাস হতে পারে এবং বেনামী ক্লাসের মধ্যে উপলব্ধ।

উদাহরণস্বরূপ: (কোনও জিওডব্লিউ কোড থেকে টেক্সট বক্স পরিবর্তন পরিচালনা করতে):

/* Regular method. Returns the required interface/abstract/class
   Arguments are defined as final */
private ChangeHandler newNameChangeHandler(final String axisId, final Logger logger) {

    // Return a new anonymous class
    return new ChangeHandler() {
        public void onChange(ChangeEvent event) {
            // Access method scope variables           
            logger.fine(axisId)
        }
     };
}

এই উদাহরণের জন্য, নতুন বেনামী ক্লাস-পদ্ধতির সাথে উল্লেখ করা হবে:

textBox.addChangeHandler(newNameChangeHandler(myAxisName, myLogger))

অথবা , OP এর প্রয়োজনীয়তাগুলি ব্যবহার করে:

private ActionListener newActionListener(final int aVariable) {
    return new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("Your variable is: " + aVariable);
        }
    };
}
...
int myVariable = 1;
newActionListener(myVariable);

কোনও বেনামী শ্রেণীতে পরামিতি পাস করা বা বাহ্যিক পরামিতি অ্যাক্সেস করা কি সম্ভব? উদাহরণ স্বরূপ:

int myVariable = 1;

myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // How would one access myVariable here?
    }
});

শ্রোতাদের আমার ভার্চুয়াল অ্যাক্সেসের জন্য কোনও উপায় আছে নাকি শ্রোতাদের তৈরি করা প্রকৃত শ্রেণী হিসাবে তৈরি করা যায় না?


টেকনিক্যালি, না, কারণ বেনামী ক্লাস নির্মাতারা থাকতে পারে না।

যাইহোক, ক্লাস scopes ধারণকারী থেকে পরিবর্তনশীল উল্লেখ করতে পারেন। একটি বেনামী ক্লাসের জন্য এটি অন্তর্ভুক্ত শ্রেণী (es) বা স্থানীয় ভেরিয়েবলগুলি থেকে চূড়ান্ত রূপ চিহ্নিত করা যেতে পারে।

সম্পাদনা : পিটার উল্লেখ করে, আপনি বেনামী ক্লাসের সুপারক্লাসের কন্সট্রাকটরকে পরামিতি পাশ করতে পারেন।


যেমন http://www.coderanch.com/t/567294/java/java/declare-constructor-anonymous-class এ দেখানো হয়েছে আপনি একটি ইনস্ট্যান্স ইনিশিয়েটিজার যুক্ত করতে পারেন। এটি একটি ব্লক যার নাম নেই এবং এটি প্রথম নির্বাহিত হয় (ঠিক যেমন একটি কনস্ট্রাক্টর)।

মনে হচ্ছে তারা কেন জাভা ইনস্ট্যান্সের প্রাথমিক উদ্যোক্তাদের নিয়ে আলোচনা করছে ? এবং কিভাবে একটি ইনস্ট্যান্স প্রাথমিক একটি কনস্ট্রাকটর থেকে ভিন্ন? কনস্ট্রাক্টর থেকে পার্থক্য আলোচনা।


এটার মত:

final int myVariable = 1;

myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // Now you can access it alright.
    }
});

আপনি প্লেইন lambdas ব্যবহার করতে পারেন ("Lambda এক্সপ্রেশন ভেরিয়েবল ক্যাপচার করতে পারেন")

int myVariable = 1;
ActionListener al = ae->System.out.println(myVariable);
myButton.addActionListener( al );

এমনকি একটি ফাংশন

Function<Integer,ActionListener> printInt = 
    intvar -> ae -> System.out.println(intvar);

int myVariable = 1;
myButton.addActionListener( printInt.apply(myVariable) );

ফাংশন ব্যবহার করে সজ্জা এবং অ্যাডাপ্টার refactor একটি দুর্দান্ত উপায়, এখানে দেখুন

আমি শুধু lambdas সম্পর্কে শেখার শুরু করেছি, তাই যদি আপনি একটি ভুল স্পট, একটি মন্তব্য লিখুন বিনা দ্বিধায়।


অন্য লোকেরা ইতিমধ্যে উত্তর দিয়েছে যে বেনামী ক্লাসগুলি শুধুমাত্র চূড়ান্ত ভেরিয়েবল অ্যাক্সেস করতে পারে। কিন্তু তারা মূল পরিবর্তনশীল অ ফাইনাল রাখা কিভাবে প্রশ্ন খোলা ছেড়ে। অ্যাডাম মলডজিনস্কি একটি সমাধান দিয়েছেন কিন্তু চমত্কার bloated হয়। সমস্যাটির জন্য অনেক সহজ সমাধান রয়েছে:

আপনি যদি আমার myVariable ফাইনালটি চূড়ান্ত করতে না চান তবে এটি একটি চূড়ান্ত পর্যায়ে মোড়ানো হবে যেখানে এটি কোনও ব্যাপার নয়, যদি এটি চূড়ান্ত হয়।

int myVariable = 1;

{
    final int anonVar = myVariable;

    myButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            // How would one access myVariable here?
            // Use anonVar instead of myVariable
        }
    });
}

আদম মোলজিজিনস্কি তার উত্তরে অন্য কিছু করেন না কিন্তু আরো অনেক কোড দিয়ে।


আমি ভেবেছিলাম বেনামী শ্রেণী মূলত lambdas মত কিন্তু খারাপ সিনট্যাক্স সঙ্গে ... এটা সত্য হতে সক্রিয় কিন্তু সিনট্যাক্স এমনকি খারাপ এবং স্থানীয় ভেরিয়েবল অন্তর্ভুক্ত করা হয় (কি হওয়া উচিত) ধারণকারী ভেরিয়েবল মধ্যে bleed আউট।

আপনি পিতামাতার ক্লাসে তাদের তৈরি করে কোনও চূড়ান্ত ভেরিয়েবল অ্যাক্সেস করতে পারবেন না।

যেমন

ইন্টারফেস:

public interface TextProcessor
{
    public String Process(String text);
}

শ্রেণী:

private String _key;

public String toJson()
{
    TextProcessor textProcessor = new TextProcessor() {
        @Override
        public String Process(String text)
        {
            return _key + ":" + text;
        }
    };

    JSONTypeProcessor typeProcessor = new JSONTypeProcessor(textProcessor);

    foreach(String key : keys)
    {
        _key = key;

        typeProcessor.doStuffThatUsesLambda();
    }

আমি জাভা 8 এ এটি সাজিয়েছি কিনা তা আমি জানি না (আমি EE জগতে আটকে আছি এবং এখনও 8 নন) কিন্তু C # এ এটি দেখতে হবে:

    public string ToJson()
    {
        string key = null;
        var typeProcessor = new JSONTypeProcessor(text => key + ":" + text);

        foreach (var theKey in keys)
        {
            key = theKey;

            typeProcessor.doStuffThatUsesLambda();
        }
    }

আপনি সি # একটি পৃথক ইন্টারফেস প্রয়োজন হয় না ... আমি এটা মিস্! আমি নিজেকে জাভাতে আরও খারাপ ডিজাইন খুঁজে পেয়েছি এবং নিজেকে আরও পুনরাবৃত্তি করছি কারণ কোডের পরিমাণ + জাভাতে কিছুটা পুনঃব্যবহার করার জন্য আপনাকে যুক্ত করতে জটিলতাটি অনেক সময় অনুলিপি এবং পেস্ট করার চেয়ে খারাপ।


হ্যাঁ, একটি 'ইনি' প্রদান করে এবং যে পদ্ধতিটি অবিলম্বে কল করে এমন একটি প্রাথমিক পদ্ধতি যোগ করে:

int myVariable = 1;

myButton.addActionListener(new ActionListener() {
    private int anonVar;
    public void actionPerformed(ActionEvent e) {
        // How would one access myVariable here?
        // It's now here:
        System.out.println("Initialized with value: " + anonVar);
    }
    private ActionListener init(int var){
        anonVar = var;
        return this;
    }
}.init(myVariable)  );

কোন 'চূড়ান্ত' ঘোষণা প্রয়োজন।


একটি বহিরাগত পরিবর্তনশীল মধ্যে কিছু মান জন্য একটি সহজ উপায় (বেনামী শ্রেণী জন্য অন্তর্গত না) কিভাবে folow হয়!

একইভাবে যদি আপনি একটি বহিরাগত পরিবর্তনশীল মান পেতে চান আপনি একটি পদ্ধতি তৈরি করতে পারেন যা আপনি চান কি ফিরে!

public class Example{

    private TypeParameter parameter;

    private void setMethod(TypeParameter parameter){

        this.parameter = parameter;

    }

    //...
    //into the anonymus class
    new AnonymusClass(){

        final TypeParameter parameterFinal = something;
        //you can call setMethod(TypeParameter parameter) here and pass the
        //parameterFinal
        setMethod(parameterFinal); 

        //now the variable out the class anonymus has the value of
        //of parameterFinal

    });

 }

আপনি একটি জেনেরিক untyped মানচিত্র আছে, তাহলে আপনি ব্যবহার করতে পারেন:

Map map = new HashMap();
for (Map.Entry entry : ((Set<Map.Entry>) map.entrySet())) {
    System.out.println(entry.getKey() + "/" + entry.getValue());
}




java anonymous-class