একটি অকার্যকর বস্তু ফিরে


113

কোনও Voidপ্রকারটি আদিম না হলে কোনও প্রকারটি ফেরত দেওয়ার সঠিক উপায় কী ? যেমন। আমি বর্তমানে নীচের মত নাল ব্যবহার।

interface B<E>{ E method(); }

class A implements B<Void>{

    public Void method(){
        // do something
        return null;
    }
}

1
আমি দোভাষী প্যাটার্নটি ব্যবহার করে একটি ফাইল ফর্ম্যাটের জন্য একজন অনুবাদক লিখছি, তবে কিছু এক্সপ্রেশনটির ফেরতের মান নেই
রবার্ট

2
অকার্যকর প্রকারটি ইনস্ট্যান্ট করার কোনও উপায় নেই, সুতরাং যদি আপনাকে সত্যিই সেই ধরণের কিছু ফিরিয়ে দিতে হয় তবে নাল আপনার একমাত্র বিকল্প। যাইহোক, আপনার সম্ভবত কোনও কিছুর জন্য প্রত্যাবর্তিত মানের প্রয়োজন নেই, তাই নালটি ভাল হওয়া উচিত।
উয়র্ন

হ্যাঁ, এটি আমার যুক্তিও ছিল - আরও অবাক করার উপায় ছিল কিনা তা ভেবেই অবাক হলেন
রবার্ট

1
আমি এটি আপনার উদাহরণের মতো কোড করব। এটি একটি সূক্ষ্ম পদ্ধতির।
ডেভিড রুসেল

উত্তর:


134

শূন্য শ্রেণিটি জাভা কীওয়ার্ড শূন্যতার প্রতিনিধিত্ব করে শ্রেণি অবজেক্টের একটি রেফারেন্স ধরে রাখার জন্য একটি অনিবার্য স্থানধারক শ্রেণি।

সুতরাং নীচের যে কোনওটি যথেষ্ট হবে:

  • পরামিতি দিয়ে Objectএবং ফিরে new Object()বাnull
  • পরামিতি দিয়ে Voidএবং ফিরেnull
  • NullObjectআপনার একটি দিয়ে প্যারামিটারাইজিং

আপনি এই পদ্ধতিটি তৈরি করতে পারবেন না void, এবং অন্য যে কোনও কিছু ফেরত দেয় । যেহেতু কিছু উপেক্ষা করা হয়েছে, আপনি কিছু ফিরিয়ে দিতে পারেন।


2
তারপরে রিটার্নের ধরণের শূন্যতা অর্জনের সাধারণ উপায় কী?
রবার্ট

1
যদি আপনি শূন্য হিসাবে নাল ফিরে আসতে চান তবে কিছু ক্ষেত্রে এটি নিক্ষেপ করতে হবে: (শূন্য) নাল
প্যাট্রিক ফ্যাভ্রে


(অকার্যকর) নালকে কোনওভাবেই নাল থেকে পৃথক করা যায়?
ওরেঙ্গল

13

জাভা 8 একটি নতুন ক্লাস চালু করেছে Optional<T>, এটি এই জাতীয় ক্ষেত্রে ব্যবহার করা যেতে পারে। এটি ব্যবহার করতে, আপনি নীচের মত আপনার কোডটি সামান্য পরিবর্তন করতে চাই:

interface B<E>{ Optional<E> method(); }

class A implements B<Void>{

    public Optional<Void> method(){
        // do something
        return Optional.empty();
    }
}

এটি আপনাকে নিশ্চিত করতে সহায়তা করে যে আপনি সর্বদা আপনার পদ্ধতি থেকে একটি নন-নাল রিটার্ন মান পাবেন, এমনকি যখন ফেরার কিছু নেই। এটি বিশেষত শক্তিশালী যখন সেই সরঞ্জামগুলির সাথে মিলিতভাবে ব্যবহৃত হয় যা কখন nullফিরে যায় বা কখন ফিরে পাওয়া যায় না তা সনাক্ত করে , যেমন- গ্রহন @NonNullএবং @Nullableটীকাগুলি।


5
আমার মতামতটি ভুল পথে চলছে। আরও সীমাবদ্ধ টাইপটি প্রত্যাবর্তন করা ভাল যা অর্থকে আরও পরিষ্কার করে দেয়। এমন কোনও কিছু যা Optional<Void>আপনার কাছে একই কারণে দেয় তা অপ্রয়োজনীয়, আপনি সর্বদা একটি Optional<Void>খালি পান এবং অন্য সমস্ত পদ্ধতি অর্থহীন। এটি optionচ্ছিক মানটি কেন ব্যবহার করা উচিত তার বিপরীত। আপনি এটি ব্যবহার করেন কারণ এর কোনও মূল্য বা নাও থাকতে পারে। এছাড়াও সংকলক এটি কার্যকরভাবে method()প্রয়োগ করে না। এই রানটাইম এ ব্যর্থ হবে: return Optional.of(null)
স্টিনিবোট

3

আপনার ধরণের হিসাবে যদি আপনার কেবল প্রয়োজন না হয় তবে আপনি অকার্যকর ব্যবহার করতে পারেন। এটি কার্যকারিতা বা ক্রিয়া বাস্তবায়নের জন্য ব্যবহার করা যেতে পারে। আপনি তখন এরকম কিছু করতে পারেন:

interface Action<T> {
    public T execute();
}

abstract class VoidAction implements Action<Void> {
    public Void execute() {
        executeInternal();
        return null;
    }

    abstract void executeInternal();
}

অথবা আপনি বিমূর্ত শ্রেণিটি বাদ দিতে পারেন এবং প্রতিটি ক্রিয়ায় রিটার্নটি শূন্য করতে পারেন যার জন্য নিজেকে কোনও ফেরতের মূল্যের প্রয়োজন হয় না।

তারপরে আপনি এই ক্রিয়াগুলি এর মতো ব্যবহার করতে পারেন:

একটি পদ্ধতি দেওয়া

private static <T> T executeAction(Action<T> action) {
    return action.execute();
}

আপনি এটি পছন্দ করতে পারেন

String result = executeAction(new Action<String>() {
    @Override
    public String execute() {
        //code here
        return "Return me!";
    }
});

বা, অকার্যকর কর্মের জন্য (মনে রাখবেন যে আপনি ফলাফলকে কোনও কিছুতে নির্ধারিত করছেন না)

executeAction(new VoidAction() {
    @Override
    public void executeInternal() {
        //code here
    }
});

2
আমার ইতিমধ্যে যা আছে তার থেকে এটি কীভাবে আলাদা? এটি এখনও শূন্যরূপে ফিরে আসে, যেমন আমি প্রস্তাব দিয়েছি
রবার্ট

কেন অন্য কিছু ফিরিয়ে দিতে হবে? আমি যে বিষয়টিটি চেষ্টা করতে চাইছি তা হ'ল আপনার কাছে ফেরতের মান দরকার নেই, তাই আপনি কী ফিরে আসবেন তা বিবেচ্য নয়। আমি আমার সম্পাদনা দিয়ে তা পরিষ্কার করার চেষ্টা করেছি।
জর্ন

1

কেবল এটির জন্য, Voidপ্রতিবিম্বটি ব্যবহার করে উদাহরণ তৈরি করার অবশ্যই সম্ভাবনা রয়েছে :

interface B<E>{ E method(); }

class A implements B<Void>{

    public Void method(){
        // do something

        try {
            Constructor<Void> voidConstructor = Void.class.getDeclaredConstructor();
            voidConstructor.setAccessible(true);
            return voidConstructor.newInstance();
        } catch (Exception ex) {
            // Rethrow, or return null, or whatever.
        }
    }
}

আপনি সম্ভবত এটি উত্পাদন করতে পারবেন না।


0

এমন কোনও জেনেরিক টাইপ নেই যা সংকলককে বলবে যে কোনও পদ্ধতি কিছুই দেয় না।

আমি বিশ্বাস করি যে টাইপ প্যারামিটার হিসাবে উত্তরাধিকার সূত্রে কনভেনশনটি অবজেক্টটি ব্যবহার করে

অথবা

টাইপ প্যারামিটার আপ প্রচার করুন এবং তারপরে আপনার শ্রেণীর ব্যবহারকারীগণ অবজেক্টটি ব্যবহার করে এবং টাইপ-ওয়াইল্ডকার্ড ব্যবহার করে কোনও ভেরিয়েবল টাইপ করে অবজেক্টটি বরাদ্দ করুন ?:

interface B<E>{ E method(); }

class A<T> implements B<T>{

    public T method(){
        // do something
        return null;
    }
}

A<?> a = new A<Object>();

1
জেনেরিকগুলি দিয়ে শূন্যে ফিরতে টাইপের সেট করার কনভেনশনটি - এটি আমার কাছে খুব অকার্যকর দেখাচ্ছে না?
রবার্ট

আমি বিশ্বাস করি এটিই যাওয়ার পথ। শ্রেণীর A<?>যে কোনও ব্যবহারকারী তার প্রত্যাবর্তিত মানের কোনও ব্যবহার করতে সক্ষম হবে না method()
ক্রিস্টোফার ওয়েজব্যাক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.