Posts

Showing posts from January, 2020

Enum

Image
Enumlar asagidaki shekilde yaradilir.   TOPLA, CIX, VUR, BOL - bunlari istifade ederde arxa planda her birinin OPERATION tipinde obyekti yaranir ve her birinin constructoru super() constructoru cagirir. QEYD: 1.OPERATION enumu yaradilan zaman ozu arxada Enum classindan extends edir 2. TYPE SAFETY - Immutable , deyishdirile bilmir Ishlenme qaydasi  

S O L I D

S: Single Responsibility Principle O: Open-Closed Principle   L: Liskov Substitution Principle I: Interface Segregation Principle D: Dependency Inversion Principle S : Her bir class yalniz bir ishi gormelidir .  DBConnector classimiz var. Bu class yalniz DB ya connect ishini gormelidir, her hansi CRUD emeliyyati burda olmasi duzgun deyil. Bashqa numune, Tutaq ki, Student ve Teacher classlarimiz var. Melumdur ki, Student ve Teacher ayri ayriliqda datalara sahibdir, bunlari eyni class daxilinde tutmaq duzgun deyil. Bu metodlara da aiddir. O : Class extends olunmaga aciq, modifier olunmaga bagli olmalidir. Tutaq ki, Car ve ondan extends eden BMW classi var. Sonradan eger BMW classinda her hansi deyishiklik olsa, bu zaman NewBMW classini yaradib ve BMW den extends etmeliyik. BMW classinin ichinde deyishiklik etmek duzgun sayilmir. L : Extends edilen classin obyekti evezine extends olunan classin obyektini gondermek hemishe mumkun olmalidir. Meselen Car classini BMW clas

Factory Pattern and Abstract Factory Pattern

Image
Factory Pattern Tutaq ki, Shape interface var ve daxilinde draw() deye bir metod var. Rectangle , Circle, Square classlari ise bu interfaceden implements edir. ShapeFactory deye bir class var ve bu class vasitesile lazim olan classlarin obyektlerini elde ede bilirik. Bu class daxilinde getShape deye bir metod var ve bu metod Shape type i String olaraq alir ve Stringe uygun olaraq muxtelif obyekti qaytarir. Polimorfizme alinan obyekti Shape interface nin obyektine set ede bilirik. draw metodunu cagirmaqla elde etdiyimiz obyektin draw metodunu istifade edirik. Ustun ceheti bundan ibaretdir ki, meselen proyektde Square classi daha sonradan istifadeye yararli olmadi ve Square2 adli bir class yaratdilar. Bizim deyishiklik lazim olan hisse yalniz ShapeFactory de SQUARE String i gelen zaman geriye new Square2(); obyekti return elemek olacaq. Ve evvel istifade olunan yerlerde hiss olunmaycaq ki, hal hazirda istifade etdkleri obyekt Square classinin yox, Square2 classinin

Proxy Pattern

Image
Proxy pattern Bir obyekti temsil eden bashqa bir obyekt nezerde tutulur bu patternde. Her hansi bir tehlukesizliyin qarshisi alinmir, sadece Proxy uzerinden lazim olan obyekte chatiriq ve bu cache sistemi ile gedir. Tutaq ki, DB ya qoshulmaq uchun uzun bir vaxt teleb eden configrationlardan ibaret olan class var: HeavyConnector. Normalda bu classdan obyekt yaradan kimi bu DB ile elaqe hal hazirda lazim oldu ve ya olmadi yaranir. Bu da proyektin gec ishlemesine sebeb ola biler. Buna gore Proxy anlayishindan istifade olunur. Artiq Connector interface den istifade edib, polimorfizme gore ProxyConnector classinin obyektini yaradib Connector obyektine set ede bilerik. Connector connector = new ProxyConnector(); bu setirde yalniz ProxyConnector obyekti yaranacaq. heavyConnect metodu hele cagrilmayib. Yalniz connector.connect(); dedikden sonra HeavyConnector classinin obyekti yaranacaq ve constructor vasitesile bu metod cagrilacaq.

Builder Pattern

Image
Builder Pattern (StringBuilder misal gostermek olar) Tutaq ki, her hansi bir class-miz var ve bu class daxilinde bir neche deyishen movcuddur (5,10 ve daha chox). Obyekti yaratmaq uchun constructora ehtiyac duydugumuzdan, her bir deyishen ve kombinasiyaya uygun constructor yaratmaliyiq. Bu da uygun yol sayilmir. Misal, tutaq ki, Image class var ve bu class in deyishen sayi choxdur. Constructorlarin sayi artmasin deye ImageBuilder tetbiq edirik. ImageBuilder ozunde Image obyektini saxladir ve ImageBuilder Constructoruna muraciet eden zaman, Image obyekti yaranir. Image parametrlerine uygun olaraq set medolari olur ve her defe yaratdigimiz Image obyektine parametrleri set edib ImageBuilder i geri qaytaririq. Sonda ish bitdikden sonra, build metodu vasitesi ile, Image obyektini elde edirik. Problem Bele bir sual meydana chixir ki, eger Image classinin constructoru ve set get metodlari publicdise, niye ImageBuilder classindan istifade etmeliyik ?  Bu problem

Mutable , Immutable class

Immutable class obyektleri yaranan zaman deyishenleri  stabil qalan ve hech vaxt deyishilmeyen classlara deyilir. Meselen String immutable classdir. Bunun uchun final keyword istifade etmek olar. Eger final keyword istifade olunmayibsa , lakin proyektin hech bir yerinde bu class a aid deyishen deyishdirilmeyibse , demeli bu effectivly final sayilir. Tutaq ki, class daxilinde private String name; deyisheni movcuddur. Bu deyishenin set metodu olmamalidir. Yalniz constructor vasitesile ilkin halda qiymeti menimsedilmelidir. Bu zaman , class immutable adlanir. Lakin bele bir hal mumkundur ki, class daxilinde bashqa bir class in obyekti yaradilmish olsun ve bu 2ci class immutable olmasin. (yeni her hansi deyisheni public olsun). Baxmayaraq ki, 1ci class da bu obyektin set metodu yoxdur. lakin , get metodu vasitesile ile 2ci classin obyektini elde edib, onun her hansi public deyisheninin deyerini deyishe bilerik. Mutable class ise immutable classlarin eksi olur. Yeni sade bildiyim

Singleton Pattern

Image
  Singleton Pattern   Tutaq ki, proyektimizde her hansi bir class var ve bu class in obyektinin yalniz bir defe yaranmagini isteyirik. Misal getirek, meselen bir Connector classimiz var ve bu class ne qeder obyekti yaransa bele eyni ish gorur. Buna gore proyekt daxilinde yalniz bir defe yaradilmagi bes edir. Constructor mutleq private olmalidir , eks halda ayri bir class yaradib, Connector classindan extends edib, hemin yaradilan classin obyektini polimorfizm gore Connector obyekti kimi yaradib istifade etmek olar. 

Interface

Abstract class kimi Interface - in de obyektini yaratmaq olmur. Esas ferq bundan ibaretdir ki, class yalniz bir classi extends ede biler, lakin bir neche interface i implements ede biler. extends - compile time safety implements - safety ustunluyu yoxdur Ferqi bele izah etmek olar ki, meselen Car classinda start ve stop metodlari var. Lakin bu metodlar ayricaliqda ozleri bir xusisyyetdir. Yeni neyinki mashin, bir neche eshya start ve stop oluna biler.Meselen Telefonun start ve stop olmasi da bir xususiyyetdir ve bu o demek deyil ki , telefon da Car classindan extends etmelidir. Marker Interface - ler nedir ? Misal uchun Serializable interface gostermek olar. Misal uchun her hansisa classn obyektini sebekede kimese gonderende , fayla yazanda ve ya oxuyanda mutleq bu interface i implement etmelidir. Bes niye gore extends etmir, implement edir ? Evvela, bir class yalniz bir classs dan extends ede biler. Bu o demekdir ki, meselen BMW class eyni zamanda hem Serailizable classind

Abstraction

Tutaq ki, Car, BMW, Mercedes classlarimiz var. Car classinda start stop speedUp metodlari movcuddur. BMW ve Mercedes Car classindan extend etdikden sonra bu metodlari Override elemelidir ki, ozune uygunlashdirsin. Eger Override elemek yaddan chixsa, ve bashqa adli metod duzeltse, bu zaman arxitekturadan qiraga chixmish olacaq. Buna gore abstract class lardan istifade olunur. Abstract class da verdiyimiz arxitekturani, yeni verdiyimiz metodlar mutleq override olunmalidir. Abstract classlarin obyektini yaratmaq mumkun deyil Eger yaratmaga cehd etsek, bu zaman JVM ozu avtomatik obyekt yaradir ve bu obyekt abstract class in obyekti olmur, sadece onu extend ede classin obyekti olur. Car abstractCar = new Car() { @Override public void start () { } @Override public void stop () { } } ; Inner Class ve Nested Class anlayishlari Inner class dedikde, Class daxilinde yaradilan ve yalniz obyekte xas olan class basha dushulur. (non-static) Nested c

treasure :D

ternary operator in thymeleaf ( th:href ) Get Textarea Line breaks in a Java String

How to Get the Current Logged-In Username or id in Spring Security

CustomUserDetail vasitesile Object principal = SecurityContextHolder . getContext () .getAuthentication() .getPrincipal() ; if (principal instanceof CustomUserDetail){ //some code } else { //some code }

OOP in Java - Inheritance and Polymorphism

Image
Tutaq ki, Student ve Teacher class-larimiz var ve bu class-lar name , surname,  age adli eyni deyishenlere sahibdir. Umumi baxsaq, name surname age her bir kesde olur. Buna gore bir Person class i duzeldirik ve ichine name surname age deyishenlerini atiriq. Student ve Teacher de olan eyni adli deyishenleri silirik. Lakin, hele de proqramda Student ve Teacher hele de Person sayilmir. Bunun uchun uygun class-lari Person classindan extend etmek lazimdir. Bu zaman, uygun class-lar Person classinin xususiyyetlerine ( yeni, deyishen ve ya metodlarina sahib olacaq ). Duzgun halda qeyd etmek olar ki, Student ve Teacher classi daxilinde xususi olaraq qeyd olunur ki, Person classinin deyishen ve metodlari bu uygun classa aiddir. Lakin, birbasha aid deyil. Tutaq ki, Teacher classina xas olan salary deyisheni movcuddur. Bu zaman, hemin deyisheni Teacher classinda yaratmaliyiq. Bu deyishene ne Student classi ne de Person classi sahib olacaq. Burdan bele netice alinir ki, extend olunan class

Static and not-static block

public class User { static { /*some code 1*/ } public static void foo (){ /*some code 2*/ } } Tutaq ki, static block da ve foo metodunda her hansi System.out.println("..."); kodlari var. Eger User classindaki foo metodunu cagirsaq, ilk once static block-un kodlari daha sonra foo metodunun kodlari icra olunacaqdir. Bunun esas sebebi bundadir ki, class load olunan zaman, ilk once static block ishe dushur. Lakin bunu qeyd etmek lazimdir ki , eger biz hemin class i istifade etmesek, static block un kodlari icra olunmayacaq. QEYD : static block yalnizca bir defe, class load olunan zaman ishe dushur. Meselen, class daxilinde bir nece metod varsa ve bunlari ayri aryi cagirib istifade etsek bele static block yalnizca bir defe ishleyecek. Bele bir hal mumkundur ki, User classin da hech deyishen ve ya metod olmasin. Bu zaman bunu istifade etmek de mumkun olmayacaq. Buna gore asagidaki koddan istifade olunur. Class.forName("package.Use

StringBuilder and StringBuffer

Niye StringBuilder istifade etmeliyik ? String s = "Java"; s += " is"; s += " good"; Meselen bele bir cumle duzeldirik. Normal String elan eden zaman, eslinde arxada String obyekti yaranir. Yeni, String s = "Hamid"  -> String s = new String("Hamid"); ekvivalentdir. Yuxardaki numuneye baxsaq, 1ci setirde "Java" deyeri ile bir obyekt, 2ci setirde " is" deyeri ile ikinci ve birleshdirilerek "Java is" deyeri ile 3cu, 3cu setirde " good" deyeri ile 4cu ve birleshdirilerek "Java is good" deyeri ile 5ci obyekt yaranir. Bu numunede o qeder qeyri-adi gorsenmese de, bunu bir dovre daxilinde 100 defe ve ya daha chox istifade etsek, bu zaman yaddash problemi yashaya bilerik. Buna gore bu optimal kod hesab edilmir. StringBuilder vasitesi ile bu kodu optimal hala getirmek olar. StringBuilder s = new StringBuilder(); s.append("Java"); s.append(" is"); s.append(

Strings

Java da String Pool deye bir anlayish var. Tutaq ki , ashagdaki shekilde Stringler elan etmishik. String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); String s4 = new String("Hello"); Burada s1 obyektini yaradan zaman, avtomatik yaradildigina gore bu obyekt String Pool a dushur. s2 obyekti yaradan zaman ise, artiq yeni obyekt yaranmir ve String Pool da yaradilmish eyni deyerli obyekt istifade olunur. s3 ve s4 ise , ozumuz new emri istifade ederek obyekt yaratdigimiza gore bu obyektler String Pool a dushmur. Ayrica olaraq yaranir. Etrafli

Wrapper types, Boxing and Unboxing

UPDATE : 02.06.21 Wrapper type - lar nedir ve niye istifade olunur ? - Wrapper type-lar ozlerinde reference type saxlasalar da eslinde primitive typelardan ibaretdirler. meselen Integer bir class olsa da ona verdiyimiz her hansisa int deyer ele class daxilinde olan bir int field da saxlanilir. Wrapper type-lar primitive typelarin daha genish variantidir. Elave ozellikler, yeni methodlar ve ya lazimli deyishenler ozunde saxlayir. Java da ishletdiyimiz int, long, float kimi tipler eslinde class lara aid tiplerdir. Yeni bu tiplerin her birinin ozune mexsus classi var. Meselen : Integer i = new Integer(5); Integer i2 = 5; yazmaq , eslinde eyni menaya gelir. 2ci usuldaki kimi yaradanda, artiq Integer obyektini ozu yaradir. Bu proses Boxing adlanir. Verdiyimiz deyer , hemin obyektdeki int deyishenine menimsedilir. Burada esas ferq bundan ibaretdir ki, meselen : Integer i = 5; Integer i2 = 5; Integer i3 = new Integer(5); burada, birinci obyekt yaranan zaman 5 boxing olunur ve ya

Constructors

Her hansi bir metodu cagirarken moterizelerden istifade olundugu kimi, obyektleri yaradan zamanda bu moterizelerden istifade olunur. Demek ki, obyekt yaradan zaman biz neyise cagiririq. Eslinde obyekt yaradan zaman, consturctorlar vasitesile yaradiriq. package com.consturctors ; public class Person { private String name ; private String surname ; private Integer age ; public Person () {} } Tutaq ki, Person class movcuddur. Eger biz hech bir constructor yaratmamishiqsa, Java ozu avtomatik olaraq bu bosh consturctoru yaradir. Person p = new Person() ; new Person() yazdigimizda eslinde hemin bosh consturctoru cagirmish oluruq. Bir class daxilinde ferqli sayda parametrli bir nece constructor ola biler. Tutaq ki, yuxardaki kimi Person obyekti yaratdiq ve parametrli constructoru cagirmadiq. this() vasitesile , bir constructor daxilinden diger consturctoru cagirmaq olar. package com.consturctors ; public class Person { private String name ; pri

POJO and Bean

POJO - Plain Old Java Object Bildiyimiz sade Java obyekti nezerde tutulur. Ister ichinde her hansi deyishen ve get ve set metodlari olsa bele bu class POJO adlanir. Class bosh olsa bele , POJO-dur. Bean Eger class encapsulation olunubsa (private,get,set) ve data dashimaq uchun istifade olunursa, demeli bu class Bean-dir. Her POJO , Bean deyil. Lakin her Bean , POJO-dur.

null and undefined

null ozu eslinde xususi deyer kimidir. Bosh bir deyer kimi istifade olunur. var test = null ; Yeni, heleki test deyisheni yaradilmayib, null-dir. Asagidaki halda ise deyishen undefined olur. Bu esasen deyishen yaradilib, hech bir deyer menimsetmeyende olur. Amma null-dan ferqli olaraq deyishen yaranir. var test ;