যদি বস্তু ইন্টারফেস প্রয়োগ করে তবে পরীক্ষা করুন


149

এটি সম্ভবত আগে জিজ্ঞাসা করা হয়েছিল, তবে দ্রুত অনুসন্ধান কেবল সি # এর জন্য অনুরোধ করা একই প্রশ্নটি হাজির করেছিল। এখানে দেখো.

আমি মূলত যা করতে চাই তা হল কোনও প্রদত্ত বস্তু একটি প্রদত্ত ইন্টারফেস প্রয়োগ করে check

আমি এক ধরনের সমাধান খুঁজে পেয়েছি তবে এটি বা ক্ষেত্রে বিবৃতিতে ঘন ঘন এটি ব্যবহার করা যথেষ্ট আরামদায়ক নয় এবং আমি ভাবছিলাম যে জাওয়ার অভ্যন্তরীণ সমাধানটি নেই।

public static Boolean implementsInterface(Object object, Class interf){
    for (Class c : object.getClass().getInterfaces()) {
        if (c.equals(interf)) {
            return true;
        }
    }
    return false;
}


সম্পাদনা: ঠিক আছে, আপনার উত্তরের জন্য ধন্যবাদ। বিশেষত ড্যামিয়েন পোলেট এবং নলডোরিনের কাছে, আপনি আমাকে আমার নকশাটি পুনর্বিবেচনা করেছেন যাতে আমি আর ইন্টারফেসের জন্য পরীক্ষা না করি।


3
যদি আপনি ফেলে দেওয়া হয় তবে আপনি কেবল কাস্টিং চেষ্টা করতে পারেন এবং ব্যতিক্রমটি ধরতে পারবেন না (অথবা জাভাতে সি # "অপারেটর হিসাবে" # এর সাথে অ্যালগ্লাসযুক্ত কিছু থাকলেও)? আমি একটি জাভা পরিবর্তে একটি সি # কোডার, তাই আমি এখানে মূলত কেবল অনুমান করছি, যদিও আমি মনে করি যে কোনও ওও ভাষায় এই জাতীয় দৃষ্টিভঙ্গি সম্ভব হবে।
নলডোরিন

1
আপনার যদি পারফরম্যান্স সম্পর্কে চিন্তা না করতে হয় তবে এই ক্ষেত্রে ব্যতিক্রম ছোঁড়া ভাল অনুশীলন।
রাফা

1
আমাকে ক্ষমা করুন কিন্তু এই উত্তরগুলি আপনাকে আপনার নকশার পুনরায় ভাবতে বাধ্য করেছে? এমনকি যদি তারা মুছে ফেলে তবে তারা কী ছিল? আপনি কি আমাকে দয়া করে @
সেবাস্তেঞ্জিগারকে

1
@ ওজানমুয়েস আমি দুঃখিত, আমি 4 বছরেরও বেশি সময় ধরে জাভা লিখিনি এবং দুর্ভাগ্যক্রমে আমি কী করেছি তা মনে করতে পারি না।
সেবাস্তেঞ্জিগার

উত্তর:


191

instanceofঅপারেটর একটি কাজ করে NullPointerExceptionনিরাপদ উপায়। উদাহরণ স্বরূপ:

 if ("" instanceof java.io.Serializable) {
     // it's true
 }

সত্য ফলন। থেকে:

 if (null instanceof AnyType) {
     // never reached
 }

ফলস মিথ্যা, instanceofঅপারেটর নাল নিরাপদ (আপনার পোস্ট করা কোডটি নয়)।

উদাহরণটি হ'ল অন্তর্নির্মিত, সংকলন-সময় নিরাপদ বিকল্প # ক্লাস # ইন্সট্যান্স (অবজেক্ট) এর


5
উদাহরণস্বরূপ যদিও ক্লাস লিটারালগুলিতে কাজ করে। সুতরাং এটি ওপি-র ক্ষেত্রে ব্যবহার করা যাবে না
লর্ডঅফ দ্য পিপস

নিশ্চিত, এটি সংকলন-সময় নিরাপদ; এবং এটি অন্তর্নির্মিত উপায় এবং এটি প্রশ্নের যুক্তি (
ইমো

পছন্দ করেছেন এটি ইন্টারফেস পাশাপাশি প্রয়োগ করা হয়েছে কিনা তা পরীক্ষা করে।
নিমচিম্পস্কি

5
@ নিমচিম্পস্কি: আপনি আমার বক্তব্য ভুল বুঝেছেন। শ্রেণীর আক্ষরিকতা হ'ল যখন আপনি আপনার উত্স কোডের মতো MyClass.classবা লেখেন MyInterface.class। ক্লাস লিটারেলগুলি ক্লাস, ইন্টারফেস এবং আদিম ধরণের উল্লেখ করতে পারে এবং শ্রেণি শ্রেণীর সাথে সম্পর্কিত দৃষ্টিকোণটি ফিরিয়ে দেবে। আমার বক্তব্যটি হল ওপি কোনও শ্রেণীর আক্ষরিক ব্যবহার করছে না, বরং পরিবর্তে শ্রেণীর শ্রেণীর একটি উদাহরণ রয়েছে, এবং দুর্ভাগ্যক্রমে মূলশব্দটির ডানদিকে অপারেটর instanceofঅবশ্যই শ্রেণীর আক্ষরিক হতে হবে, শ্রেণির শ্রেণীর উদাহরণ নয়।
লর্ডঅফ দ্য পিপস

@dsdsdsd এই পোস্টটি যেহেতু আমি এ সম্পর্কে শুনিনি / পড়িনি, তবে গুগলে অনুসন্ধান করার পরে আমি বুঝতে পেরেছি এটি নুল পয়েন্টার ব্যতিক্রমের সংক্ষিপ্তসার।
ওজানমুয়েস

42

এটি করা উচিত:

public static boolean implementsInterface(Object object, Class interf){
    return interf.isInstance(object);
}

উদাহরণ স্বরূপ,

 java.io.Serializable.class.isInstance("a test string")

মূল্যায়ন true


8

আমি পছন্দ করি instanceof:

if (obj instanceof SomeType) { ... }

যা তুলনায় অনেক বেশি সাধারণ এবং পাঠযোগ্য SomeType.isInstance(obj)


5
মনে রাখবেন যে if (obj instanceof SomeType) { ... }এটি স্থির (এটি - এটি রানটাইমের সময় পরিবর্তন করতে পারে না) এবং SomeType.isInstance(obj)গতিশীল।
টমাসজ বিলেসজুস্কি


3

আপনি যদি ইন্টারফেসের জন্য পরীক্ষা করতে চান:

public List<myType> getElement(Class<?> clazz) {
    List<myType> els = new ArrayList<myType>();
    for (myType e: this.elements.values()) {
        if (clazz.isAssignableFrom(e.getClass())) {
            els.add(e);
        }
    }
    return els;

}

ক্লজ হ'ল একটি ইন্টারফেস এবং মাইটাইপ এমন একটি প্রকার যা আপনি সংজ্ঞায়িত করেছেন যা বেশ কয়েকটি ইন্টারফেস প্রয়োগ করতে পারে। এই কোডের সাহায্যে আপনি কেবলমাত্র প্রকারগুলি পান যা একটি সংজ্ঞায়িত ইন্টারফেস প্রয়োগ করে


1

আজ রাতে অ্যান্ড্রয়েডের সাথে আমার এই সমস্যাটি ছিল এবং জাভাডোক সমাধানগুলি দেখার পরে আমি এই বাস্তব কাজের সমাধানটি নিয়ে এসেছি কেবলমাত্র আমার মতো লোকদের জন্য যা জাভাদোকের ব্যাখ্যা ছাড়া কিছুটা বেশি প্রয়োজন।

এখানে অ্যান্ড্রয়েড জাভা ব্যবহার করে প্রকৃত ইন্টারফেস সহ একটি কার্যকারী উদাহরণ। এটি অ্যাক্টিভিটি যা চেক করে যা AboutDialogListener ক্ষেত্র কাস্ট করার চেষ্টা করার আগে AboutDialogListener ইন্টারফেস প্রয়োগ করেছে।

public class About extends DialogFragment implements OnClickListener,
    OnCheckedChangeListener {

public static final String FIRST_RUN_ABOUT = "com.gosylvester.bestrides.firstrunabout";


public interface AboutDialogListener {
    void onFinishEditDialog(Boolean _Checked);
}

private AboutDialogListener adl;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Activity a = this.getActivity();
    if (AboutDialogListener.class.isInstance(a)) {
        adl = (AboutDialogListener) a;
        }
}

... পরে আমি ইন্টারফেস কল করার আগে ফিল্ড এডল হয় কিনা তা পরীক্ষা করে দেখুন

@Override
public void onStop() {
    super.onStop();
    sharedPref.edit().putBoolean(About.FIRST_RUN_ABOUT, _Checked).commit();
    // if there is an interface call it.
    if (adl != null) {
        adl.onFinishEditDialog(is_Checked());
    }
}

0

অ্যাপাচি কমন্স-ল্যাং অ্যারে ইউটিলসের সাহায্যে আপনার প্রয়োজনীয় ইন্টারফেসটি আপত্তি করার ইন্টারফেসগুলিতে রয়েছে কিনা তা দেখুন

public static Boolean implementsInterface(Object object, Class interf){
    return ArrayUtils.contains(object.getClass().getInterfaces(), interf);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.