OOP Java 21: Nested class

Java yazılarımızda OOP (OYP) silsiləsinin Nested class yazısı ilə bitiririk. Gəlin bu sonuncu yazıda Nested class, İnner class anlayışlarına baxaq.

Nested classlar üçün işin mənbəsinə gedib baxdıqda, aşağıdakı ifadə ilə rastlaşırıq:

Java proqramlaşdırma dilin bir sinfi, başqa bir sinifdə müəyyən etməyə (təyin etməyə, yazmağa) imkan verir. Belə bir sinifə “nested” sinif deyilir və belə təsvir olunur:

class OuterClass{
class NestedClass{
}
}

Terminologiyaya baxsaq görərik ki, nested siniflər iki yerə bplünür: static və non-static.

  1. Nested sinfi biz static təyin etdikdə o “static nested class” adlanır.
  2. Non-static nested siniflər “inner class” adlanır.

İnner classlara keçməmişdən ümumi olaraq Nested siniflərin nə işə yaradığını, daha doğrusu niyə istifadə edildiyi haqqında belə deyi: Bir sinfin var olma səbəbi, sırf sadəcə başqa bir sinfə bağlıdırsa, o zaman bu sinif nested classdır. Misal üçün bir binanın mərtəbələri kimi. O mərtəbə (nested class) bina olmasa mövcutluğunun bir mənası qalmır, sadəcə o binaya məxsus olur.

Shaddowing deyilən bir şey var, bir dəyişənin keçərlilik alanı, istifadə edilmə forması-yeri. Gəlin misalla baxa:

İstəsəz əlavə olaraq bu yazıya baxın.

İndi inner class-ların bölünməsinə keçək:

(Şəklin mənbəsi)

  1. Inner Classes –
  2. Method lcoal Inner classes –
  3. Aninymous Inner classes –

Əlavə olaraq bu videoya da baxa bilərsiniz. Uğur ola!

Advertisements

Android 39: SQLite

Ötən yazımızda bir listimiz var idi, xatırlayırsınızsa. Əvvəldən üzərində hazır şagird informasiyaları qeyd edilmişdi. Sonra əlavə et düyməsininə basaraq yenlərini əlavə edirdik. Lakin bir problem vardı orda. Tədbiqetmədən çıxıb, yenidən başltdıqda əlavə etdiklərimiz harda olurdu? Heçarda. Silinib getmişdi. Nətər olur? O boyda əzyətlə əlavə etdiklərimiz hanı? Olmaz axı belə.

Demək elə bir şey etməliyik ki, həmin listimiz yaddaşda qalsın. İstədiyimiz vaxt istifadə edə, əalvələr edə bilək.

Bax elə bunun üçün də Android telefonların üzərində hazır gələn SQLite-dan istifadə edəcəyik.

Bunun üçün həmin layihə üzərindən yeni bir sinif yaradırıq. Mən adını DBHelper qoyuram, siz istədiyiniz adı qoya bilərsiniz. Əsas odu, adını görəndə nə məna verdiyi başa düşəsiniz. (“Asdfggh” – qoymayın yəni).

Sinfimiz’ “SQLiteOpenHelper” sinfini extends edirik. Sonra isə implement etməli olduğumuz konstruktor və onCreate()/onUpgrate() metodları var.

İndi bizə lazım olan dəyişənləri yaratmaq lazımdır.

Yaratdığımız metodalra və dəyişənlərə baxaq.

  • DBHelper(…) – bizim konstruktor metodumuzdur. Verilənlər bazası ilə necə əlaqə quracağımızı göstərir.
  • onCreate – Verilənlər bazası üçün cədvəlləri yaratmaq üçün istifadə edilir.
  • onUpgrade – versiyan yeniləmək üçün istifadə edilir. (Sizin 3 sətriniz var, versiya kodunuz 1dir, sonra sətirlərin sayını artırdıqda versiya kodunuzu dəyişməsəz SQLite işləməyəcək. Versiya kodu dəyişdirilərkən edilməli olan proseslər bu metodda yazılır).

 

  • DB_VERSION – Versiya kodumuzu saxlayır.
  • DB_NAME – Verilənlər bazasın adınıs axlayır
  • TB_STUDENT – cədvəlin adını saxlayır

Digər 4ü isə cədvəldə uyğun olaraq şagirlərin sırasını (id), adını, soyadını və sinif nömrısii saxlayır.

İndi konstruktorumuz üzərində kiçik dəyişiklik edək.

Qeyd: Kodları sonda verəcəm, indilik əliniz öyrəşsin deyə siz yazın. Bunun üçün də şəkilləri yerləşdirirəm.

Konstruktorumuzun arqumentlərini azaldıb, həmin informasiyaları öz dəyişənlərimizdən aldıq. Məncə indi konstrukdor daha aydın olar sizə (hansı arqument nədir deyə).

Gəlin indi Cədvəlimizi yaradaq. Verilənlər bazası ilə işləyənlər bilər, indi “CREATE TABLE” əmri ilə müvafiq sütunlarımızı yaradacağıq.

Kod sətirimiz string daxilində belə olmalıdır:

"CREATE TABLE TB_STUDENT(STUDENT_ID int primary key, STUDENT_NAME text, STUDENT_LAST_NAME text, STUDENT_CLASS text)"

Qeyd: burada “primary key” –  təkrarlanmayan dəyərlər üçün istifadə edilir, hər bir cədvəldə sadəcə bir sütun üçün işlədilə bilər.

İndi biz yuxarda görüdüyümüz stringin içində yazılan bəzi adları hazır dəyişənlərimizdən çağıracağıq. Çünki zamanla əgər cədvəldəki hər hansı bir sütunun adı dəyişdirilərsə o zaman bütün kodlardakı adları yox, sadəcə bir yerdən – təyin etdiyimiz yerdən dəyişdirmək kifayət etsin.

SQLiteDatabase-in execSQL metodundan istifadə edərək cədvəliizi yaradaq:

Yuxardakı execSQL metodu istifadə edərəm onUpgrade metodumuz üçün cədvəli silmə və yenidən yaratma prosesini yazaq:

Bu hissəsi hazır. Gəlin indi DBHelper sinfimizə “AddStudent” metodu əlavə edək, bu metod vasitəsiylə bazaya yeni sətirlər əlavə edəcəyik. Bu metod bizdən student obyekti tələb etsin.

getWritableDatabase() – metodu verilənlər bazasına məlumat əlavə etmək üçün istifadə olunur.

İndi qayıdaq MainActivity-yə. Listimizi, adapterimizi silək. DBHelper üçün qlobal obyektimizi yaradaq:

DBHelper dbHelper = new DBHelper(MainActivity.this);

Adapterimizi isə aşağdıdakı kimi təyin edək:

adapter = new Adapter(MainActivity.this, dbHelper.getAllStudent());

Burada getAllStudent metodun hələ yazmamışıq. Bu metod vasitəiylə verilənlər bazasından listimizi alacağıq. Bunun üçün DBHelper sinfinə keçid edək və bizə ArrayList qaytaracaq olan metodumuzu yazaq:

Verilənlər abzasına veriənlərimizi əlavə edərkən necə ki getWritableDatabas metodundan istifadə etdik, indi də getReadableDatabase() metodundan istifadə edəcəyik.

Cursordan istifadərək “rawQuery” metodun çağıraq. Bu metod verilənlər bazası üçün müəyyən əmirləri etməyimizə bizə kömək edəcək. Edəcəyimiz əmir şagirdlər cədvəlindəki bütün informasiyanı çağırmaq üçündür. Bayaq ArrayList-imizi (“ArrayList<Student> arrayList = new ArrayList<>();”) MainActivity-dən silmişdik, burada yazaq. Cursorun sonuncu sətirə düşənə qədər ediləcək prosesləri while içərisində yazaq. Belə ki, Şagird metodu yaradıb, getColumnIndex metodalrı ilə müvafiq dəyişənləri cursordan alıb yaratdığımız Şagird obyektinə ötürürük. Sonra həmin obyekti listə “add” edirik, cursoru növbətinə keçirirk. Dövr bitəndən sonra cursoru “close” etmək yaddan çıxmasın. Metodumuz yaratmış olduğumuz arraList-i “return” edəcək. Kod aşağıdakı kimidir:

İndi nə edirik? MainActivity-yə qayıdırıq, onActivityResult içərisində dəyişikliyimizi edək.

Burda nə etdik biz? Adapter daxilindəki “RefreshArray” metoduna dbHelperin obyektini ötürdük. Axı Adapterdə helə bir metod yox idi. Onda gedək yazaq:

Son iki dəyişikliyimizə bir daha baxaq. İstifadəçi “add” buttonuna basarkən həmin sinif açılacaq, istifadəçinin daxil etdiyi məlumatalr verilənlər bazasına ötürüləcək. Son iki dəyişikliyimizə görə: istifadəçi əsas səhifəyə qayıdarkən (əlavə etmə səhifəsində “finish”-ə basdıqdan sonra) avtomatik olaraq tədbiqetmə ilk yaradılarkən baş verdiyi kimi məlumat bazasına sorğu göndərib ordan informasiyaları alıb listimizdə göstərəcəyik.

Tədbiqetməmizi işə salaq: error verdi helə? Çünki AddActivity daxilindəki kodalrda dəyişiklik etməmişik axı.

Qlobal şəkildə dbHelper obyektini yaratmaq yaddan çıxmasın ()

İndi tədbiqetməmizi işə salaq:

Yazılar çox qarışıqdı. İnternetdə mənbələr boldu, lakin hamısı xırda fəqlərlə bir-birindən ayrı görünür. Türk dilində bir neçə mənbə tapmışam sizlər üçün, istəsəz onlara baxın. Əvvəl mən kodlarımı verim: buyrun.

Mənbələr:

[1] http://alicanakkus.com/2014/12/android-sqlite-1/
[2] https://gelecegiyazanlar.turkcell.com.tr/konu/android/egitim/android-401/veritabani-kullanimi
[3] http://umiitkose.com/2015/09/android-studio-sqlite-giris/http://umiitkose.com/2015/09/android-studio-sqlite-veritabani-olusturma/http://umiitkose.com/2015/09/android-sqlite-ekleme-guncelleme-silme-kayit-getirme/
[4] https://www.youtube.com/watch?v=CVN2vY7fmeo&t=173s

 

OOP Java 20: Map (Kolleksiya)

Əvvəlki yazılarda kolleksiyalardan biri olan List haqqında danışmış, ətraflı baxmışdıq. Bu yazımızda MAP-lərdən söz açacağıq.

Map ümumi olaraq açarSöz-qiymət qarşılığından ibarətdir. Yəni istifadə etdiyiniz hər bir dəyərə uyğun bir açar söz.

Tələbələrinizin adlarından ibarət bir siyahıda, onların tələbə nömrələrini düşünə bilərsiniz. Burda tələbəNömrəsi-tələbəAdı kimi bir MAP münasibəti yaranır. Bu zaman ortaya bu informasiya çıxır: hər bir tələbənin adı eyni ola bilər, lakin, onların nömrələri (tələbəNömrəsi) eyni ola bilməz. İndi biz eyni olmayan o “key” (açar) vasitəsiylə ona uyğun olan dəyəri tapa bilirik.

Gəlin əvvəlcə bir map listi yaradaq. Sonra həm ona dəyər mənimsətməyə, həm də digər istifadə edilən metodlarına baxaq:

Map list1 = new HashMap();

Map tipində list1 təyin etdik. Əgər IDE sizdə importlara kömək etmirsə, özünüz java.util kitabaxanasındakı müvafiq sinifləri import edin:

import java.util.Map;
import java.util.HashMap;

İndi list1-ə yeni elemetlər mənimsədək: bunun üçün .put() metodundan istifadə edilir.

 list1.put(1200656, "Əliməmməd"); list1.put(1200657, "Əbülfəz"); 

Burda bir məsələ var. Əgər yuxardakı formada siz Map üçün list yaratsaz, istədiyiniz tipdə dəyər ötürə bilərsiniz. Sırf xüsusi formatda tiplərə uyğun map yaratmaq istədikdə aşağıdakı kimi yazırıq:

Map<Integer, String> list2 = new HashMap<Integer, String>();

List1-dən fərqli olaraq list2 üçün yeni dəyər əlavə edərkən məhz açarSöz Integer, ona uyğun gələn qiymət isə String tipində olmalıdır.

İndi gəlin map üçün işlədə biləcəyimiz metodlara ümumi şəkildə baxaq:

  • get(key) – açar sözə uyğun olan qiyməti qaytarır
  • remove(key) – açar sözə uyğun qiyməti silir
  • clear – map daxilindəki bütün qiymətləri silir
  • containKey() və containValue – uyğun olaraq açar sözün və ya qiymətin map listimizdə olub-olmamsını yoxlayır
  • size() – siyahının uzunluğunu verir.

Biraz da mənbə verim, mövzunu dərinləməsinə araşdırıb-öyrənin:

[1] http://serkansakinmaz.blogspot.com/2013/09/java-collectionsjava-koleksiyonlar.html
[2] https://gelecegiyazanlar.turkcell.com.tr/konu/android/egitim/android-101/map
[3] https://www.tutorialspoint.com/java/java_map_interface.htm

OOP Java 19: List üçün bəzi metodlar (2)

Keçən yazımızda listlərə aid bəzi metodları yazmışdıq. İndi gəlin əlaqədar digər metodlara baxaq:

  • .retanAll() – bir növ kəsişmə. Listlər arasında eyni olan elemntləri (bir elementdən bir neçə dənədirsə sadəcə bir dəfə) list şəklində qaytarır.
  • .set(index, element) – listin həmin indeksdəki elementini dəyişdirmək, yeni element mənismətmək üçün istifadə olunur.
  • .subList(başlanğıcİndeksi, bitişİndeksi) – başlanğıc və bitiş indeksləri arasındakı elementləri list olaraq qaytarır.

 

OOP Java 18: Iterator və ListIterator

Iterator və ListIterator listlər üzərində gəzişməyə imkan verən metodlardır.

Iterator – sadəcə irəli gəzişməyə, ListIterator isə həm irəli həm geri gəzişməyə imkan verir.

İteartorun əsas 3 metodu var istifadə edilən:

  • hasNext() – Iistdə (irəliyə doğru) növbəti elementin olub-olmamasını yoxlayır
  • next() – növbəti elementə keçir (dəyərini qaytarır)
  • remove() – olduğu elementi silir

Listİteratorun metodları isə aşağıdakılardır:

  • add() – olduğu elementdən sonraya yeni bir element artırar
  • hasNext( ) – Iistdə (irəliyə doğru) növbəti elementin olub-olmamasını yoxlayır
  • hasPrevious( ) – Iistdə (geriyə doğru) növbəti elementin olub-olmamasını yoxlayır
  • next() – növbəti elementə keçir (dəyərini qaytarır)
  • nextIndex() – növbəti elementin indeksini verir, əgər list bitibsə, listin uzunluğunu verir.
  • previous( ) – əvvəlki elementə keçir (dəyərini qaytarır)
  • previousIndex() – əvvəlki elementin indeksini verir, əgər list bitibsə -1 verir.
  • remove() – olduğu elementi silir
  • set() – o anki elementə yeni dəyər mənimsətməyə yarayır

Bu yazını yazarkən işlətdiyim mənbələr:

[1] http://yazdoldur.com/programlama/java/java-iterator-ve-listiterator-kullanimi/
[2] https://www.tutorialspoint.com/java/java_using_iterator.htm

OOP Java 17: List üçün bəzi metodlar

Keçən yazımızda kolleksiyaların bir növü olan Listlər haqqında ümumi danışmış, massivlərdən fərqlərini göstərmişdik. İndi gəlin əlaqədar digər metodlara baxaq:

  • .isEmpty() – boş olub-olmamasını yoxlayır.
  • .contains(arg) – listdə həmin arqumentin olub-olmamsını yoxlayır.
  • .conteainsAll() – listdə başqa bir listin bütün elementlərinin olub-olmamasını yoxlayır.
  • .remove() – listdən element silir.
  • .removeAll() – listdən listi silir.
  • .get() – verilən indeksə uyğun listin elementini qaytarır.
  • .indexOf()  – verilən elementə uyğun indeks qaytarır.
  • .lastIndexOf() – verilən elementə uyğun listdəki sonuncu indeksi qaytarır.

 

OOP Java 16: Collections (Kolleksiyalar)

Eyni tipli verilənlər toplusu massiv (2) adlanırdı, xatırlayırsınızsa əgər. İndi onların biraz daha geniş və daha çox funksiyaya malik olan formasına baxaq: Kolleksiyalar.

Kolleksiyaların aşağıdakı tiplri mövcutdur:

  1. List (siyahı)
  2. Set (çoxluq)
  3. Map (lüğət)
  4. Queue (növbə

List sıralı şəkildə olub massiv kimi indekslərə malikdir. 3 fərqli forması var:

  1. ArrayList
  2. LinkedList
  3. Vector

Gəlin List üzərindən gedək və massivlərlə fərqlərinə baxaraq daha ətraflı və müqayisəli şəkildə öyrənməyə çalışaq.

  1. Massivdə say məhdudiyyəti var idi, limit-sərhəd öncədən məlum olurdu, kolleksiyalarda isə say yoxdur. Massiv üçün .length, kolleksiya üçün .size() istifadə olunacaq.
  2. Massivlər ibtidai tipdə olur, kolleksiyalar obyekt tipində.
  3. Massivi yaradarkən “int[] aArray = {5, 3 , 2, 1, 4};” yaradarkən təyin edirik və ya “int[] aArray = new int[5];” şəklində yaradıb sonradan “aArray[0] = 5;” təyin edirik.  List yaradarkən: “List<Integer> aList = new ArrayList<>();” yazılır. listə yeni elemet əlavə edərkən .add() metodu çağrılır. Misal: “aList.add(5);”. (Bir də addAll var, birbaşa massivi əlavə edirsən)

Başlanğıc üçün bu qədər informasiya yetərlidir. Növbəti yazıda kolleksiyalar üçün işlədilə bilən digər metodlara baxarıq.

Maraqlananlar üçün əlavə mənbələr:

[1] http://www.baskent.edu.tr/~tkaracay/etudio/ders/prg/dataStructures/Collections/collections_ndx.html
[2] https://mericberber.com/javase/
[3] https://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist
[4] https://www.tutorialspoint.com/java/java_collections.htm