O'zgarmas interfeys - Immutable interface

Yilda ob'ektga yo'naltirilgan dasturlash, "o'zgarmas interfeys"a naqsh dizayni uchun o'zgarmas ob'ekt.[1] O'zgarmas interfeys naqshlari hech birini ta'minlamaydigan turni aniqlashni o'z ichiga oladi usullari mutatsion holat. Ushbu turdagi ma'lumotlarga ega bo'lgan ob'ektlar o'zgaruvchan holatga ega emas va o'zgarmas bo'lib ko'rinadi.

Misol

Java

Ikki o'lchovli nuqtani ifodalovchi Java sinfini ko'rib chiqing.

jamoat sinf Point2D {    xususiy int x;    xususiy int y;    jamoat Point2D(int x, int y) { bu.x = x; bu.y = y; }    jamoat int getX() { qaytish bu.x; }    jamoat int getY() { qaytish bu.y; }    jamoat bekor setX(int newX) { bu.x = newX; }    jamoat bekor setY(int yangiY) { bu.y = yangiY; }}

Point2D klassi o'zgaruvchan: uning holatini setter usullaridan birini chaqirib (setX () yoki setY ()).

Point2D uchun o'zgarmas interfeys quyidagicha ta'riflanishi mumkin:

jamoat interfeys ImmutablePoint2D {    jamoat int getX();    jamoat int getY();}

Point2D-ni ImmutablePoint2D-ni amalga oshirish orqali mijoz kodi mutatsion usullarga ega bo'lmagan va shuning uchun o'zgarmas ko'rinadigan turga murojaat qilishi mumkin. Bu quyidagi misolda ko'rsatilgan:

ImmutablePoint2D nuqta = yangi Point2D(0,0);  // Point2D ning aniq misoliga o'zgarmas interfeys murojaat qiladiint x = nuqta.getX(); // joriy usul chaqiruviint y = nuqta.setX(42); // kompilyatsiya xatosi: setX () usuli ImmutablePoint2D turida mavjud emas

Faqatgina o'zgarmas interfeysga murojaat qilish orqali aniq ob'ekt holatini o'zgartiradigan usulni chaqirish haqiqiy emas.

Afzalliklari

  • Turning o'zgarmas niyatini aniq etkazadi.
  • Amalga oshiradigan turlardan farqli o'laroq O'zgarmas o'rash naqsh, mutatsiyani "berish" orqali "bekor qilish" shart emasAmaliyot yo'q "mutatsiya usuli chaqirilganda ko'rsatma yoki ish vaqti istisnosini tashlash.

Kamchiliklari

  • O'zgarmas interfeys turiga havola qilingan misollar bo'lishi mumkin gips ularning konkret, o'zgaruvchan turiga va holati mutatsiyaga ega. Masalan:
    jamoat bekor mutatsiyaga uchragan(ImmutablePoint2D nuqta) {    ((Point2D)nuqta).setX(42); // bu qo'ng'iroq qonuniydir, chunki turi mavjud                               // o'zgarishi mumkin bo'lgan Point2D sinfiga o'tkazildi}
  • Beton sinflar o'zgarmas interfeysni amalga oshirayotganligini aniq e'lon qilishlari kerak. Agar aniq sinf uchinchi tomon kodiga "tegishli" bo'lsa, masalan, agar u kutubxonada bo'lsa, buni amalga oshirish mumkin emas.
  • Ob'ekt haqiqatan ham o'zgarmas va shuning uchun xash xaritalar kabi o'zgarmaslikka tayanadigan ma'lumotlar tuzilmalarida foydalanish uchun mos emas. Va ob'ekt "o'zgaruvchan tomondan" bir vaqtning o'zida o'zgartirilishi mumkin.
  • O'zgarmas ob'ektlar uchun mavjud bo'lgan ba'zi kompilyator optimallashlari o'zgaruvchan ob'ektlar uchun mavjud bo'lmasligi mumkin.

Shu bilan bir qatorda

O'zgarmas interfeys naqshiga alternativa bu o'zgarmas o'ram naqsh

Doimiy ma'lumotlar tuzilmalari o'zlarining o'zgartirilgan qarashlariga imkon berishda samarali o'zgarmasdir.

Adabiyotlar