Reja: Visibility (kirishni boshqarish sinf a'zolari)


Sinf a'zolariga kirish modifikatorlarining qisqacha mazmuni


Download 28.82 Kb.
bet2/2
Sana01.03.2023
Hajmi28.82 Kb.
#1239118
1   2
Bog'liq
Visibility

Sinf a'zolariga kirish modifikatorlarining qisqacha mazmuni
Modifikatorning ko'rinishi merosiga kirish
Faqat shaxsiy sinfni meros qilib bo'lmaydi
Modifikator yo'q / Paketdagi paket paketdagi pastki sinf mavjud bo'lsa
Himoyalangan paketda quyi sinfda mavjud
Hamma joyda ommaviy. Kichik sinfda mavjud
Bir paytlar usullar yoki usullarga qo'llanilishi mumkin bo'lgan shaxsiy himoyalangan (bir vaqtning o'zida ikkala kalit so'z) modifikatori mavjud edi o'zgaruvchilar ularni paketdan tashqaridagi kichik sinfdan foydalanishlari mumkin, lekin ularni sinflar uchun shaxsiy qilib qo'ying bu paket. Biroq, bu Java 1.0 versiyasida olib tashlandi.
Interfeys a'zolari
public interface MyInterface { public void foo();
int bar();
public String TEXT = "Hello";
int ANSWER = 42;
public class X { } class Y { } }
Interfeys a'zolari har doim ochiq ko'rinishga ega bo'ladi, hatto ochiq kalit so'z o'tkazib yuborilgan bo'lsa ham. Shunday qilib, foo(), bar(), TEXT, ANSWER, X va Y ham hammaga ochiq ko'rinishga ega. Biroq, kirish hali ham o'z ichiga olgan interfeys bilan cheklangan bo'lishi mumkin - MyInterface umumiy ko'rinishga ega bo'lganligi sababli, uning a'zolariga istalgan joydan kirish mumkin, ammo MyInterface paket ko'rinishiga ega bo'lganida, uning a'zolariga faqat bitta paket ichidan kirish mumkin bo'lar edi.
Umumiy
Umumiy sinflar, interfeyslar va usullarni boshqa sinflar va interfeyslarni tip parametrlari sifatida qabul qilish imkonini beradi. Bu misolda burchakli qavslar (<>) bilan ajratilgan yagona turdagi T parametrini olish uchun Param umumiy sinfidan foydalaniladi.
public class Param {
private T value;
public T getValue() {
return value; }
public void setValue(T value) {
this.value = value; } }

Bu sinfni yaratish uchun T o‘rniga tip argumentini keltiring. Masalan, Integer:


Param integerParam = new Param();
Tur argumenti har qanday mos yozuvlar turi bo'lishi mumkin, jumladan massivlar va boshqa umumiy turlar:
Param stringArrayParam;
Param int2dArrayParam;
Param
> objectNestedParam;
Java SE 7 va undan keyingi versiyalarida turdagi argumentni bo'sh turdagi argumentlar to'plami (<>) bilan almashtirish mumkin. olmos:
Version ≥ Java SE 7
Param integerParam = new Param<>();
Boshqa identifikatorlardan farqli o'laroq, tip parametrlarida nomlash cheklovlari yo'q. Biroq, ularning nomlari odatda birinchi ularning maqsadi katta harf bilan yozilgan. (Bu hatto rasmiy JavaDocs uchun ham amal qiladi.)
Masalan, “tur” uchun T, “element” uchun E va “kalit”/”qiymat” uchun K/V.
Extending a generic class
public abstract class AbstractParam {
private T value;
public T getValue() {
return value; }
public void setValue(T value) {
this.value = value } }

AbstractParam - T tipi parametri bilan e'lon qilingan mavhum sinfdir. Bu sinfni kengaytirganda, o'sha turdagi parametr <> ichida yozilgan tip argumenti bilan almashtirilishi mumkin yoki tip parametri o'zgarishsiz qolishi mumkin. In quyidagi birinchi va ikkinchi misollar, String va Integer turi parametrini almashtiradi. Uchinchi misolda, turi parametri o'zgarishsiz qoladi. To'rtinchi misolda generiklardan umuman foydalanilmaydi, shuning uchun u sinfda mavjud bo'lganiga o'xshaydi Ob'ekt parametri. Kompilyator AbstractParam ning xom turi ekanligi haqida ogohlantiradi, lekin u kompilyatsiya qiladi ObjectParam klassi. Beshinchi misolda 2 turdagi parametr mavjud (quyida "bir nechta turdagi parametrlar" ga qarang), ikkinchi parametr tur parametri sifatida superklassga o'tdi.


public class Email extends AbstractParam {
// ...
}
public class Age extends AbstractParam {
// ...
}
public class Height extends AbstractParam {
// ...
}
public class ObjectParam extends AbstractParam {
// ...
}
public class MultiParam extends AbstractParam {
// ...
}
Foydalanish quyidagicha:
Email email = new Email();
email.setValue("test@example.com");
String retrievedEmail = email.getValue();
Age age = new Age();
age.setValue(25);
Integer retrievedAge = age.getValue();
int autounboxedAge = age.getValue();
Height heightInInt = new Height<>();
heightInInt.setValue(125);
Height heightInFloat = new Height<>();
heightInFloat.setValue(120.3f);
MultiParam multiParam = new MultiParam<>();
multiParam.setValue(3.3);
E'tibor bering, Email sinfida T getValue() usuli xuddi String getValue() imzosi bordek ishlaydi va void setValue(T) usuli xuddi void setValue(String) deb e'lon qilingandek ishlaydi. Bundan tashqari, bo'sh jingalak qavslar ({}) bilan anonim ichki sinf bilan misol qilish mumkin: AbstractParam balandligi = new AbstractParam(){}; height.setValue(198,6); GoalKicker.com – Professionallar uchun Java® eslatmalari 267 E'tibor bering, olmosni anonim ichki sinflar bilan ishlatish mumkin emas.
Bir nechta turdagi parametrlar
Java umumiy sinf yoki interfeysda bir nechta turdagi parametrlardan foydalanish imkoniyatini beradi. Ko'p turdagi parametrlar burchak orasiga vergul bilan ajratilgan turlar ro'yxatini qo'yish orqali sinf yoki interfeysda ishlatilishi mumkin. qavslar. Misol:
public class MultiGenericParam {
private T firstParam;
private S secondParam;

public MultiGenericParam(T firstParam, S secondParam) {


this.firstParam = firstParam;
this.secondParam = secondParam;
}

public T getFirstParam() {


return firstParam; }
public void setFirstParam(T firstParam) {
this.firstParam = firstParam; }
public S getSecondParam() {
return secondParam; }
public void setSecondParam(S secondParam) {
this.secondParam = secondParam; }}
Foydalanish quyidagi tarzda amalga oshirilishi mumkin:
MultiGenericParam aParam = new MultiGenericParam("value1", "value2");
MultiGenericParam dayOfWeekDegrees = new MultiGenericParam(1, 2.6);
Java generics sintaksisi noma'lum turni ifodalovchi joker belgilar bilan chegaralangan? bu:
? kengaytiradi T yuqori chegaralangan joker belgini ifodalaydi. Noma'lum tur a bo'lishi kerak bo'lgan turni ifodalaydi
T ning kichik turi yoki T turining o'zi.
? super T pastki chegaralangan joker belgini ifodalaydi. Noma'lum tur a bo'lishi kerak bo'lgan turni ifodalaydi
T ning super turi yoki T turining o'zi.
Qoida tariqasida, siz foydalanishingiz kerak
Agar sizga faqat "o'qish" ruxsati kerak bo'lsa, T ni kengaytiradi ("kirish") super T agar sizga "yozish" ruxsati kerak bo'lsa ("chiqish")
Agar ikkalasiga ham kerak bo'lsa ("o'zgartirish")
Extensions yoki super dan foydalanish odatda yaxshiroqdir, chunki u sizning kodingizni yanada moslashuvchan qiladi (masalan: foydalanishga ruxsat berish
subtiplar va supertiplar), quyida ko'rib turganingizdek.
class Shoe {}
class IPhone {}
interface Fruit {}
class Apple implements Fruit {}
class Banana implements Fruit {}
class GrannySmith extends Apple {}
public class FruitHelper {
public void eatAll(Collection fruits) {}
public void addApple(Collection apples) {}}
Endi kompilyator ma'lum bir yomon foydalanishni aniqlay oladi:
public class GenericsTest {
public static void main(String[] args){
FruitHelper fruitHelper = new FruitHelper() ;
List fruits = new ArrayList();
fruits.add(new Apple()); // Allowed, as Apple is a Fruit
fruits.add(new Banana()); // Allowed, as Banana is a Fruit
fruitHelper.addApple(fruits); // Allowed, as "Fruit super Apple"
fruitHelper.eatAll(fruits); // Allowed
Collection bananas = new ArrayList<>();
bananas.add(new Banana()); // Allowed
//fruitHelper.addApple(bananas); // Compile error: may only contain Bananas!
fruitHelper.eatAll(bananas); // Allowed, as all Bananas are Fruits
Collection apples = new ArrayList<>();
fruitHelper.addApple(apples); // Allowed
apples.add(new GrannySmith()); // Allowed, as this is an Apple
fruitHelper.eatAll(apples); // Allowed, as all Apples are Fruits.
Collection grannySmithApples = new ArrayList<>();
fruitHelper.addApple(grannySmithApples); //Compile error: Not allowed.
// GrannySmith is not a supertype of Apple
apples.add(new GrannySmith()); //Still allowed, GrannySmith is an Apple
fruitHelper.eatAll(grannySmithApples);//Still allowed, GrannySmith is a Fruit
Collection objects = new ArrayList<>();
fruitHelper.addApple(objects); // Allowed, as Object super Apple
objects.add(new Shoe()); // Not a fruit
objects.add(new IPhone()); // Not a fruit
//fruitHelper.eatAll(objects); // Compile error: may contain a Shoe, too!}
To'g'ri T ni tanlash, ? super T yoki? kengaytiradi T subtiplari bilan foydalanishga ruxsat berish uchun zarur. Keyin kompilyator mumkin turdagi xavfsizligini ta'minlash; agar siz translatsiya qilishingiz shart emas (bu turi xavfsiz emas va dasturlash xatolariga olib kelishi mumkin). ulardan to'g'ri foydalaning.
Agar tushunish oson bo'lmasa, iltimos, PECS qoidasini eslang: GoalKicker.com – Professionallar uchun Java® eslatmalari 269 Ishlab chiqaruvchi "Uzaytiradi" va iste'molchi "Super" dan foydalanadi. (Ishlab chiqaruvchi faqat yozish huquqiga ega, iste'molchi esa faqat o'qish huquqiga ega)
Java 7 Diamond1-ni umumiy sinf namunasi atrofidagi qozon plitasini olib tashlash uchun taqdim etdi. Java 7+ bilan siz yozishi mumkin:
List list = new LinkedList<>();
Oldingi versiyalarda yozishingiz kerak bo'lgan joyda, bu:
List list = new LinkedList();
Bitta cheklov Anonim sinflar uchundir, bunda siz hali ham namunadagi turdagi parametrni taqdim etishingiz kerak:
// This will compile:
Comparator caseInsensitiveComparator = new Comparator() {
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);}};
// But this will not:
Comparator caseInsensitiveComparator = new Comparator<>() {
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2); }};
Izoh:
1 - Ba'zi odamlar <> foydalanishni "olmos operatori" deb atashadi. Bu noto'g'ri. Olmos o'zini tutmaydi operatori va JLS yoki (rasmiy) Java darsliklarida operator sifatida tavsiflanmagan yoki ro'yxatga olinmagan. Haqiqatan ham, <> hatto alohida Java tokeni ham emas. Aksincha, u < tokenidan keyin > belgisi bo'lib, unga ega bo'lish qonuniy (yomon uslub bo'lsa ham) ikkalasi orasidagi bo'shliq yoki sharhlar. JLS va Qo'llanmalar doimiy ravishda <> "olmos" deb atashadi va shuning uchun bu uning uchun to'g'ri atama.

Download 28.82 Kb.

Do'stlaringiz bilan baham:
1   2




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling