Java'da taxallus o'xshash tuzilma

Muammoni soddalashtirdim. Misol uchun, quyidagi kod snippetida avtomobillar ro'yxati boshida bo'sh va listEmpty tabiiy ravishda to'g'ri. Biroq, birinchi satrdan keyin men ro'yxatga yangi nusxa qo'shdim va natijalarni nashr qildim. ListEmpty Boolean qiymatlari, mashinalarList.isEmpty kutilgandek qaytib kelganida o'zgarmadi.

Boolean listEmpty = carsList.isEmpty(); //carsList.isEmpty() returns true

carsLists.add(car1);

System.out.println("ListEmpty: " + listEmpty + " CarsList.isEmpty:" + carsList.isEmpty);//ListEmpty: true CarsList.isEmpty: false

Menga har doim usulning eng so'nggi natijasini ko'rsatadigan taxallus o'xshash tuzilish kerak.

alias = carsList.isEmpty(); //carsList.isEmpty() returns true

carsLists.add(car1);

System.out.println("Alias: " + alias + " CarsList.isEmpty:" + carsList.isEmpty);//Alias: false CarsList.isEmpty: false

Bir usulning natijasi o'zgarganda, taxallus o'xshash strukturaning qiymati mos ravishda o'zgarishi kerak.

Tahrirlash

Tanlangan yechim men izlayotgan narsa emas, balki eng yaqin bo'lgan. Boshqa echimlar ham mukammal va boshqa hollarda ham foydalanish mumkin.

1
Har doim usulni chaqiring. Avtomatik yangilanish sehrli o'zgaruvchisi yo'q
qo'shib qo'ydi muallif zapl, manba
Siz qidirayotgan narsalarga erishishning ko'plab usullari mavjud. Lekin buning uchun hech qanday talab yo'q. Har qanday amalga oshiriladigan dastur sizning kod ishlashingizga qo'shimcha xarajatlar qo'shadi. Faqatgina bu emas, balki qo'shimcha kodlash ham qo'shiladi, chunki u ham xato bo'ladi. Masalan, ro'yxatingiz yangilangan joyga boolean ni yangilashni unutgan bo'lsangiz nima bo'ladi. List ning isEmpty() To'plam to'g'ridan-to'g'ri kerakli darajada ko'p marta ishlatilishi uchun soddalashtirilgan. + Shuningdek, u hech qachon noto'g'ri qiymat qaytarilmasligiga kafolat beradi. Faqat kerak bo'lganda isEmpty() usulidan foydalanishni tavsiya qilaman.
qo'shib qo'ydi muallif RAS, manba
Siz qidirayotgan narsalarga erishishning ko'plab usullari mavjud. Lekin buning uchun hech qanday talab yo'q. Har qanday amalga oshiriladigan dastur sizning kod ishlashingizga qo'shimcha xarajatlar qo'shadi. Faqatgina bu emas, balki qo'shimcha kodlash ham qo'shiladi, chunki u ham xato bo'ladi. Masalan, ro'yxatingiz yangilangan joyga boolean ni yangilashni unutgan bo'lsangiz nima bo'ladi. List ning isEmpty() To'plam to'g'ridan-to'g'ri kerakli darajada ko'p marta ishlatilishi uchun soddalashtirilgan. + Shuningdek, u hech qachon noto'g'ri qiymat qaytarilmasligiga kafolat beradi. Faqat kerak bo'lganda isEmpty() usulidan foydalanishni tavsiya qilaman.
qo'shib qo'ydi muallif RAS, manba
private Boolean isAlliasEmpty() so'zini to'g'ridan-to'g'ri takomillashtirish o'rniga fucntion dan foydalaning.
qo'shib qo'ydi muallif cristianhh, manba
private Boolean isAlliasEmpty() so'zini to'g'ridan-to'g'ri takomillashtirish o'rniga fucntion dan foydalaning.
qo'shib qo'ydi muallif cristianhh, manba
Ba'zan, ro'yxatga kirish uchun to'rt yoki beshta usulni qo'llash kerak. Kodning tushunarli bo'lishi shubhasiz.
qo'shib qo'ydi muallif Bernhard Colby, manba
Ba'zan, ro'yxatga kirish uchun to'rt yoki beshta usulni qo'llash kerak. Kodning tushunarli bo'lishi shubhasiz.
qo'shib qo'ydi muallif Bernhard Colby, manba

11 javoblar

Call the method every time. isEmpty() usually is super fast,
more precisely O(1).

Agar siz birinchi navbatda ro'yxatga kirish uchun ko'p funktsiyalarni chaqirishingiz kerak bo'lsa, "takrorlash" ro'yxati o'rniga:

List<> myList = superLong().function().nesting().getList();
myList.isEmpty();
myList.isEmpty();
...

ning o'rniga

superLong().function().nesting().getList().isEmpty();
superLong().function().nesting().getList().isEmpty();
...
2
qo'shib qo'ydi

Call the method every time. isEmpty() usually is super fast,
more precisely O(1).

Agar siz birinchi navbatda ro'yxatga kirish uchun ko'p funktsiyalarni chaqirishingiz kerak bo'lsa, "takrorlash" ro'yxati o'rniga:

List<> myList = superLong().function().nesting().getList();
myList.isEmpty();
myList.isEmpty();
...

ning o'rniga

superLong().function().nesting().getList().isEmpty();
superLong().function().nesting().getList().isEmpty();
...
2
qo'shib qo'ydi

Java 8 bilan Function interfeysini ishlatishingiz mumkin:

carsList.add(car1);
Function empty = List::isEmpty;

System.out.println("ListEmpty: " + empty.apply(carsList) + " CarsList.isEmpty:" + carsList.isEmpty());
1
qo'shib qo'ydi
empty.get() so'zini qisqartiradigan Supplier empty = carsList :: isEmpty dan foydalanishi mumkin, ya'ni ro'yxatni taqdim etishning hojati yo'q. Lekin buni carsList.isEmpty() dan ko'ra yaxshiroq ko'rishni bilmayman.
qo'shib qo'ydi muallif zapl, manba
Men shunga o'xshash javobni taklif qilgandim, lekin lambda yoki biror narsa ichida kodni carsList ga saqlab qo'yishingiz kerak, agar u osonlashtira olmasa o'zgartirmaydi
qo'shib qo'ydi muallif xander, manba
Mening xatolarimga javobni apply ga o'zgartirdim. java.util.function.Function dan olingan.
qo'shib qo'ydi muallif Stefan Warminski, manba
@xander Men sizning yechimingizni ko'rishdan baxtiyorman.
qo'shib qo'ydi muallif Bernhard Colby, manba
@zapl Mening muammo carsList.isEmpty() bilan emas edi. Ro'yxatning bo'sh yoki yo'qligini bilish uchun bir nechta usullarni chaqirish kerak bo'lsa, men buni amalga oshirishning eng yaxshi yo'li deb o'yladim. Misol uchun, o'zingizning ismingizni taxallus sifatida ishlataman va zapl superLong() funktsiyasini bildiradi() funktsiyasini() .lider (). IsEmpty (). Zapl yozsam, boshqa chaqiruv natijasini olishni xohlayman.
qo'shib qo'ydi muallif Bernhard Colby, manba

Java 8 bilan Function interfeysini ishlatishingiz mumkin:

carsList.add(car1);
Function empty = List::isEmpty;

System.out.println("ListEmpty: " + empty.apply(carsList) + " CarsList.isEmpty:" + carsList.isEmpty());
1
qo'shib qo'ydi
empty.get() so'zini qisqartiradigan Supplier empty = carsList :: isEmpty dan foydalanishi mumkin, ya'ni ro'yxatni taqdim etishning hojati yo'q. Lekin buni carsList.isEmpty() dan ko'ra yaxshiroq ko'rishni bilmayman.
qo'shib qo'ydi muallif zapl, manba
Men shunga o'xshash javobni taklif qilgandim, lekin lambda yoki biror narsa ichida kodni carsList ga saqlab qo'yishingiz kerak, agar u osonlashtira olmasa o'zgartirmaydi
qo'shib qo'ydi muallif xander, manba
Mening xatolarimga javobni apply ga o'zgartirdim. java.util.function.Function dan olingan.
qo'shib qo'ydi muallif Stefan Warminski, manba
@xander Men sizning yechimingizni ko'rishdan baxtiyorman.
qo'shib qo'ydi muallif Bernhard Colby, manba
@zapl Mening muammo carsList.isEmpty() bilan emas edi. Ro'yxatning bo'sh yoki yo'qligini bilish uchun bir nechta usullarni chaqirish kerak bo'lsa, men buni amalga oshirishning eng yaxshi yo'li deb o'yladim. Misol uchun, o'zingizning ismingizni taxallus sifatida ishlataman va zapl superLong() funktsiyasini bildiradi() funktsiyasini() .lider (). IsEmpty (). Zapl yozsam, boshqa chaqiruv natijasini olishni xohlayman.
qo'shib qo'ydi muallif Bernhard Colby, manba
private Boolean isListEmpty(){
   return carsList.isEmpty()
}

Boolean o'zgaruvchiga kirish o'rniga, boolean holatini tekshirish uchun ushbu usuldan foydalaning

System.out.println("Alias: " + isListEmpty() + " CarsList.isEmpty:" + carsList.isEmpty); 
1
qo'shib qo'ydi

Agar yetkazib beruvchi misoli qaytarib berilsa lambda foydalanishingiz mumkin. Usul chaqiruvining eng so'nggi natijasi referendum orqali o'tishi bilan bir xil ishlaydi:

// note the final keyword
final List<...> list = ...
Supplier isEmpty =() -> list.isEmpty();
// now you can return it and use somewhere else
return isEmpty; 
...
list.add(...);
...
System.out.println("Is list empty? " + isEmpty.get());
1
qo'shib qo'ydi
Bu ham juda yaxshi echim (+1). Mening holimda (aEvent) o'zgarmaydiganlardan biri yakuniy emas va u Ilovani yopish doirasidagi belgilangan mahalliy o'zgaruvchining natijasi yakuniy yoki samarali yakunlangan bo'lishi kerak
qo'shib qo'ydi muallif Bernhard Colby, manba
Ha, mening joriy kodim sizning yechimingiz uchun yaxshi emas, lekin odatda, men bunga muhtojman.
qo'shib qo'ydi muallif Bernhard Colby, manba
@BernhardColTo ushbu echim uchun yakuniy bo'lishi uchun talab qilinadigan yagona o'zgaruvchiga siz davlatni so'rov qilayotgan ob'ektdir. Siz uni yakuniy qilishingiz yoki qiymati boshqa yakuniy o'zgaruvchiga belgilashingiz mumkin (lekin bu erda siz ushbu qarorning kodingizga qanday ta'sir qilishini tushunishingiz kerak).
qo'shib qo'ydi muallif Ivan Gammel, manba

Agar yetkazib beruvchi misoli qaytarib berilsa lambda foydalanishingiz mumkin. Usul chaqiruvining eng so'nggi natijasi referendum orqali o'tishi bilan bir xil ishlaydi:

// note the final keyword
final List<...> list = ...
Supplier isEmpty =() -> list.isEmpty();
// now you can return it and use somewhere else
return isEmpty; 
...
list.add(...);
...
System.out.println("Is list empty? " + isEmpty.get());
1
qo'shib qo'ydi
Bu ham juda yaxshi echim (+1). Mening holimda (aEvent) o'zgarmaydiganlardan biri yakuniy emas va u Ilovani yopish doirasidagi belgilangan mahalliy o'zgaruvchining natijasi yakuniy yoki samarali yakunlangan bo'lishi kerak
qo'shib qo'ydi muallif Bernhard Colby, manba
Ha, mening joriy kodim sizning yechimingiz uchun yaxshi emas, lekin odatda, men bunga muhtojman.
qo'shib qo'ydi muallif Bernhard Colby, manba
@BernhardColTo ushbu echim uchun yakuniy bo'lishi uchun talab qilinadigan yagona o'zgaruvchiga siz davlatni so'rov qilayotgan ob'ektdir. Siz uni yakuniy qilishingiz yoki qiymati boshqa yakuniy o'zgaruvchiga belgilashingiz mumkin (lekin bu erda siz ushbu qarorning kodingizga qanday ta'sir qilishini tushunishingiz kerak).
qo'shib qo'ydi muallif Ivan Gammel, manba

Buni Java uchun reaktiv kengaytmalar bilan amalga oshirishingiz mumkin, bu o'z-o'zidan kuzatuvchi naqshidan foydalanadi:

https://github.com/ReactiveX/RxJava

Yuqoridagi misolda quyidagilarni amalga oshirishingiz mumkin:

Observable oCarList = Observable.fromIterable(carList);
oCarList.subscribe(
  new Consumer() {
      @Override
      void accept(Car car) {
        //Method that executes when a car is added
        System.out.println(car.toString());
      }
  }
)
0
qo'shib qo'ydi

Buni Java uchun reaktiv kengaytmalar bilan amalga oshirishingiz mumkin, bu o'z-o'zidan kuzatuvchi naqshidan foydalanadi:

https://github.com/ReactiveX/RxJava

Yuqoridagi misolda quyidagilarni amalga oshirishingiz mumkin:

Observable oCarList = Observable.fromIterable(carList);
oCarList.subscribe(
  new Consumer() {
      @Override
      void accept(Car car) {
        //Method that executes when a car is added
        System.out.println(car.toString());
      }
  }
)
0
qo'shib qo'ydi

Then you probably want to use the Observer pattern. Her is how you use it: https://www.tutorialspoint.com/design_pattern/observer_pattern.htm

0
qo'shib qo'ydi

Then you probably want to use the Observer pattern. Her is how you use it: https://www.tutorialspoint.com/design_pattern/observer_pattern.htm

0
qo'shib qo'ydi