දේශීය පන්ති, ලැම්බඩා සහ 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()
මඟින් සම්පාදකයා විසින් හඳුන්වා දුන් ඩොලර් සං signs ා තිත් මගින් ප්රතිස්ථාපනය කරයි.
- අරාව පංති සඳහා, සංරචක වර්ගයෙහි කැනොනිකල් නම නම්
getCanonicalName()
ක්රමය නැවත පැමිණේ . එසේ නොමැති නම්, එය පසුව සංරචක වර්ගයේ කැනොනිකල් නාමය ලබා දෙයි .null
null
[]
මෙම getSimpleName()
ක්රමය:
- ඉහළ මට්ටමේ, කැදැලි, අභ්යන්තර සහ දේශීය පන්ති සඳහා,
getSimpleName()
ප්රභව ගොනුවේ ලියා ඇති පරිදි පන්තියේ නම නැවත ලබා දෙයි.
- නිර්නාමික පංති සඳහා
getSimpleName()
ප්රතිලාභ හිස් ය String
.
- ලැම්බඩා පංති සඳහා , පැකේජයේ නම නොමැතිව ආපසු
getSimpleName()
එවිය යුතු දේ සාධාරණයි getName()
. මෙය එතරම් තේරුමක් නැති අතර මට දෝෂයක් සේ පෙනේ, නමුත් getSimpleName()
ආරම්භ කිරීමට ලැම්බඩා පන්තියක් කැඳවීමේ තේරුමක් නැත .
- අරාව පංති සඳහා
getSimpleName()
ක්රමය මඟින් සංරචක පන්තියේ සරල නම ලබා දෙයි []
. නිර්නාමික පංතියක් වන සංරචක වර්ගය []
ඔවුන්ගේ සරල නම් වලට සමාන වන විහිලු / අමුතු අතුරු ආබාධයකි .