স্থানীয় ক্লাস, ল্যাম্বডাস এবং toString()
আগের দুটি উত্তর সম্পূর্ণ করার পদ্ধতি যুক্ত করা হচ্ছে। আরও, আমি ল্যাম্বডাসের অ্যারে এবং বেনাম শ্রেণীর অ্যারে যুক্ত করি (যা বাস্তবে কোনও ধারণা দেয় না):
package com.example;
public final class TestClassNames {
private static void showClass(Class<?> c) {
System.out.println("getName(): " + c.getName());
System.out.println("getCanonicalName(): " + c.getCanonicalName());
System.out.println("getSimpleName(): " + c.getSimpleName());
System.out.println("toString(): " + c.toString());
System.out.println();
}
private static void x(Runnable r) {
showClass(r.getClass());
showClass(java.lang.reflect.Array.newInstance(r.getClass(), 1).getClass()); // Obtains an array class of a lambda base type.
}
public static class NestedClass {}
public class InnerClass {}
public static void main(String[] args) {
class LocalClass {}
showClass(void.class);
showClass(int.class);
showClass(String.class);
showClass(Runnable.class);
showClass(SomeEnum.class);
showClass(SomeAnnotation.class);
showClass(int[].class);
showClass(String[].class);
showClass(NestedClass.class);
showClass(InnerClass.class);
showClass(LocalClass.class);
showClass(LocalClass[].class);
Object anonymous = new java.io.Serializable() {};
showClass(anonymous.getClass());
showClass(java.lang.reflect.Array.newInstance(anonymous.getClass(), 1).getClass()); // Obtains an array class of an anonymous base type.
x(() -> {});
}
}
enum SomeEnum {
BLUE, YELLOW, RED;
}
@interface SomeAnnotation {}
এটি সম্পূর্ণ আউটপুট:
getName(): void
getCanonicalName(): void
getSimpleName(): void
toString(): void
getName(): int
getCanonicalName(): int
getSimpleName(): int
toString(): int
getName(): java.lang.String
getCanonicalName(): java.lang.String
getSimpleName(): String
toString(): class java.lang.String
getName(): java.lang.Runnable
getCanonicalName(): java.lang.Runnable
getSimpleName(): Runnable
toString(): interface java.lang.Runnable
getName(): com.example.SomeEnum
getCanonicalName(): com.example.SomeEnum
getSimpleName(): SomeEnum
toString(): class com.example.SomeEnum
getName(): com.example.SomeAnnotation
getCanonicalName(): com.example.SomeAnnotation
getSimpleName(): SomeAnnotation
toString(): interface com.example.SomeAnnotation
getName(): [I
getCanonicalName(): int[]
getSimpleName(): int[]
toString(): class [I
getName(): [Ljava.lang.String;
getCanonicalName(): java.lang.String[]
getSimpleName(): String[]
toString(): class [Ljava.lang.String;
getName(): com.example.TestClassNames$NestedClass
getCanonicalName(): com.example.TestClassNames.NestedClass
getSimpleName(): NestedClass
toString(): class com.example.TestClassNames$NestedClass
getName(): com.example.TestClassNames$InnerClass
getCanonicalName(): com.example.TestClassNames.InnerClass
getSimpleName(): InnerClass
toString(): class com.example.TestClassNames$InnerClass
getName(): com.example.TestClassNames$1LocalClass
getCanonicalName(): null
getSimpleName(): LocalClass
toString(): class com.example.TestClassNames$1LocalClass
getName(): [Lcom.example.TestClassNames$1LocalClass;
getCanonicalName(): null
getSimpleName(): LocalClass[]
toString(): class [Lcom.example.TestClassNames$1LocalClass;
getName(): com.example.TestClassNames$1
getCanonicalName(): null
getSimpleName():
toString(): class com.example.TestClassNames$1
getName(): [Lcom.example.TestClassNames$1;
getCanonicalName(): null
getSimpleName(): []
toString(): class [Lcom.example.TestClassNames$1;
getName(): com.example.TestClassNames$$Lambda$1/1175962212
getCanonicalName(): com.example.TestClassNames$$Lambda$1/1175962212
getSimpleName(): TestClassNames$$Lambda$1/1175962212
toString(): class com.example.TestClassNames$$Lambda$1/1175962212
getName(): [Lcom.example.TestClassNames$$Lambda$1;
getCanonicalName(): com.example.TestClassNames$$Lambda$1/1175962212[]
getSimpleName(): TestClassNames$$Lambda$1/1175962212[]
toString(): class [Lcom.example.TestClassNames$$Lambda$1;
সুতরাং, এখানে বিধি আছে। প্রথমে আদিম প্রকারগুলি এবং এর সাথে শুরু করা যাক void
:
- যদি শ্রেণীর অবজেক্টটি কোনও আদিম ধরণের প্রতিনিধিত্ব করে বা
void
, চারটি পদ্ধতিই কেবল তার নামটি দেয়।
এখন getName()
পদ্ধতির জন্য নিয়ম :
- প্রতিটি নন-ল্যাম্বদা এবং নন-অ্যারে শ্রেণি বা ইন্টারফেসের (অর্থাত্ শীর্ষ স্তরের, নেস্টেড, অভ্যন্তরীণ, স্থানীয় এবং বেনামে) একটি নাম থাকে (যা দিয়ে ফিরে আসে
getName()
) প্যাকেজের নাম যা একটি বিন্দুর পরে থাকে (যদি কোনও প্যাকেজ থাকে) ), সংকলক দ্বারা উত্পাদিত হিসাবে তার শ্রেণি-ফাইলের নাম অনুসারে (প্রত্যয় ছাড়া .class
)। যদি কোনও প্যাকেজ না থাকে তবে এটি কেবল শ্রেণি-ফাইলের নাম। ক্লাসটি যদি অভ্যন্তরীণ, নেস্টেড, স্থানীয় বা বেনাম শ্রেণি হয় তবে সংকলকটি $
তার শ্রেণি-ফাইলের নামটিতে কমপক্ষে একটি উত্পন্ন করতে হবে। নোট করুন যে বেনামে ক্লাসের জন্য, ক্লাসের নামটি ডলার-সাইন দিয়ে শেষ হবে তার পরে একটি সংখ্যা।
- লাম্বদা শ্রেণীর নামগুলি সাধারণত অনির্দেশ্য, এবং যাইহোক আপনার সেগুলির যত্ন নেওয়া উচিত নয়। হুবহু, তাদের নামটি বদ্ধ শ্রেণীর নাম, তার
$$Lambda$
পরে একটি সংখ্যা, তারপরে একটি স্ল্যাশ এবং তার পরে অন্য নম্বর।
- প্রিমিটিভের বর্গ বর্ণনাকারী হয়
Z
জন্য boolean
, B
জন্য byte
, S
জন্য short
, C
জন্য char
, I
জন্য int
, J
জন্য long
, F
জন্য float
এবং D
জন্য double
। অ্যারেবিহীন ক্লাস এবং ইন্টারফেসের জন্য শ্রেণীর বিবরণকারী যা L
অনুসরণ করে তা getName()
অনুসরণ করে ;
। অ্যারে শ্রেণীর জন্য, শ্রেণীর বিবরণকারীটির [
পরে উপাদান উপাদান (যা নিজেই অন্য একটি অ্যারে শ্রেণি হতে পারে) এর শ্রেণি বর্ণনাকারী অনুসরণ করে।
- অ্যারে ক্লাসগুলির জন্য,
getName()
পদ্ধতিটি তার শ্রেণীর বর্ণনাকারীকে ফেরত দেয়। এই নিয়মটি কেবল অ্যারে শ্রেণীর ক্ষেত্রেই ব্যর্থ বলে মনে হচ্ছে যার উপাদান উপাদানটি ল্যাম্বডা (সম্ভবত সম্ভবত এটি বাগ), তবে আশা করি এটি যেভাবেই হওয়া উচিত নয় কারণ এমন অ্যারে শ্রেণীর অস্তিত্বেরও কোনও বিন্দু নেই যার উপাদানগুলির একটি ল্যাম্বদা।
এখন, toString()
পদ্ধতি:
- শ্রেণীর উদাহরণটি যদি একটি ইন্টারফেস (বা একটি টিকা, যা একটি বিশেষ ধরণের ইন্টারফেস) প্রতিনিধিত্ব করে, তবে
toString()
প্রত্যাবর্তন "interface " + getName()
। এটি যদি কোনও আদিম হয়, তবে এটি সহজভাবে ফিরে আসে getName()
। যদি এটি অন্য কিছু হয় (একটি শ্রেণীর ধরণের, এমনকি এটি বেশ বিচিত্র হলেও), এটি ফিরে আসে "class " + getName()
।
getCanonicalName()
পদ্ধতি:
- শীর্ষ-স্তরের শ্রেণি এবং ইন্টারফেসের জন্য,
getCanonicalName()
পদ্ধতিটি কী getName()
ফিরে আসে তার পদ্ধতিটি ফিরে আসে।
getCanonicalName()
পদ্ধতি আয় null
বেনামী বা স্থানীয় শ্রেণীর জন্য এবং যারা অ্যারে শ্রেণীর জন্য।
- অভ্যন্তরীণ এবং নেস্টেড ক্লাস এবং ইন্টারফেসের জন্য,
getCanonicalName()
পদ্ধতিটি getName()
বিন্দু দ্বারা সংকলক-প্রবর্তিত ডলার-চিহ্নগুলি প্রতিস্থাপনের পদ্ধতিটি কী করে তা ফিরিয়ে দেয় ।
- অ্যারে ক্লাসগুলির জন্য, উপাদানটি প্রকারের নামটির নাম থাকলে
getCanonicalName()
পদ্ধতিটি ফিরে আসে । অন্যথায়, এটি উপাদান টাইপ দ্বারা অনুসৃত প্রামাণ্য নামটি ফেরৎ ।null
null
[]
getSimpleName()
পদ্ধতি:
- শীর্ষ স্তরের, নেস্টেড, অভ্যন্তরীণ এবং স্থানীয় শ্রেণীর জন্য,
getSimpleName()
উত্স ফাইলে লিখিত হিসাবে শ্রেণীর নামটি প্রদান করে।
- বেনাম ক্লাসের জন্য
getSimpleName()
রিটার্ন খালি দেয় String
।
- ল্যাম্বদা ক্লাসের জন্য প্যাকেজের নাম ছাড়া
getSimpleName()
কী getName()
ফিরে আসবে তা কেবল ফেরত দেয় । এটি খুব বেশি অর্থবোধ করে না এবং আমার কাছে বাগের মতো দেখায়, তবে getSimpleName()
ল্যাম্বডা ক্লাসটি শুরু করার কোনও আহ্বান নেই ।
- অ্যারে ক্লাসের জন্য
getSimpleName()
পদ্ধতিটি অনুসরণ করে উপাদান শ্রেণীর সাধারণ নাম দেয় []
। এটিতে মজাদার / অদ্ভুত পার্শ্ব-প্রতিক্রিয়া রয়েছে যা অ্যারে ক্লাসগুলির উপাদানগুলির নাম একটি বেনাম শ্রেণীর []
তাদের সাধারণ নামগুলির মতোই।