Pages

Showing posts with label Java. Show all posts
Showing posts with label Java. Show all posts

Sunday, September 11, 2016

Membuat Objek Singleton ( Design Pattern : Singleton )

Object Oriented Programming memiliki beberapa macam design pattern. Salah satu yang paling umum dan dikenal adalah Singleton.
Singleton adalah salah satu bagian deign pattern yang berurusan dengan cara mengatur instantiasi objek dalam aplikasi. Objek hanya di buat sekali selama aplikasi hidup.

Berikut adalah syarat untuk membuat suatu class mengikuti design pattern singleton.

1. Membuat private constructor
Private constructor menyebabkan instantiasi objek tidak bisa dilakukan dari luar class.

Class ObjectSingleton {
    // memaksa instantiasi objek di level class ini sendiri
    private ObjectSingleton(){
        // optional code
    }
}

2. Membuat static method getter object singleton
Menyediakan wadah agar class lain bisa mendapatkan objek singleton tanpa harus instantiasi objek itu sendiri dikarenakan method getter nya menggunakan static.

Class ObjectSingleton {
    private static ObjectSingleton objectSingleton;
    private ObjectSingleton(){
        // optional code
    }
    // memaksa agar hanya lewat method ini saja instantiasi 1x dan pemanggilan objek singleton.
    public static getOjectSingleton (){
       if (objectSingleton == null) {
         objectSingleton = new ObjectSingleton();
     }
}
3. Meng-override clone method
Mengantisipasi dan menghalangi cloning pada objek singleton.

// memaksa throw exception ketika ada yang mencoba meng clone ObjectSingleton.
public Object clone() throws CloneNotSupportedException {
       throw new CloneNotSupportedException();
}

4, (Optional) Membuat method getter object singleton menjadi synchronized. 
Jika berhadapan dengan multi thread aplikasi, makan synchronized diperlukan untuk mengantisipasi ada 2 thread yang secara bersamaan mengakses method untuk mendapatkan objek singleton.

public static synchronized getOjectSingleton (){
       if (objectSingleton == null) {
         objectSingleton = new ObjectSingleton();
     }

Design Pattern Singleton adalah salah satu pemecahan masalah masalah umum yang dihadapi dalam rekayasa perangkat lunak (Software Engineering). Implementasi Singleton dapat ditemui dalam class Connection milik Java.

Semoga sharing ini membantu kita semua.


Just collecting notes and sharing.. Please let me know if there are wrong statements in this article or a copy-paste one

Thursday, January 23, 2014

A Brief Description about JSP, Servlet and JSF

Java Server Pages (JSP)

JSP is a Java view technology running on the server machine which allows you to write template text in (the client side languages like HTML, CSS, JavaScript and so on). JSP supports the so-called taglibs which are backed by pieces of Java code with which you can control the page flow and/or output dynamically (programmatically). A well known taglib is JSTL. JSP also supports Expression Language which can be used to access backend data (actually, the attributes which are available in page, request, session and application scopes), mostly in combination with taglibs.

When a JSP is requested for the first time or when the webapp starts up, the servlet container will compile it into a class extending HttpServlet and use it during the webapp's lifetime. You can find the generated source code in the server's work directory. In for example Tomcat, it's the /work directory. On a JSP request, the servletcontainer will execute the compiled JSP class and send the generated output (usually just HTML/CSS/JS) through the webserver over network to the client side which in turn displays it in the webbrowser.

Servlets

Servlet is an Java application programming interface (API) running on the server machine which can intercept on the requests made by the client and can generate/send a response accordingly. A well known example is the HttpServlet which provides methods to hook on HTTP requests using the popular HTTP methods such as GET and POST. You can configure HttpServlets to listen on a certain HTTP URL pattern, which is configureable in web.xml, or more recently with Java EE 6, with @WebServlet annotation.

When a Servlet is requested for the first time or when the webapp starts up, the servlet container will create an instance of it and keep it in memory during webapp's lifetime. The same instance will be reused for every incoming request whose URL matches the servlet's URL pattern. You can access the request data by HttpServletRequest and handle the response by HttpServletResponse. Both objects are available as method arguments inside any of the overridden methods of HttpServlet, such as doGet() and doPost().

JSF (JavaServer Faces)

JSF is a component based MVC framework which is built on top of the Servlet API and provides components in flavor of taglibs which can be used in JSP or any other Java based view technology such as Facelets. Facelets is much more suited to JSF than JSP. It namely provides great templating capabilities such as composite components, while JSP basically only offers the for templating, so that you're forced to create custom components with raw Java code (which is a bit opaque and a lot of tedious work in JSF) when you want to replace a repeated group of components by a single component. If you can, I recommend to drop JSP and go for Facelets when you want to develop with JSF.

As being a MVC (Model-View-Controller) framework, JSF provides the FacesServlet as the sole request-response Controller. It takes all the standard and tedious HTTP request/response work from your hands, such as gathering user input, validating/converting them, putting them in model objects, invoking actions and rendering the response. This way you end up with basically a JSP or Facelets (XHTML) page for View and a Javabean class as Model. The JSF components are been used to bind the view with the model (such as your ASP.NET web control does) and the FacesServlet uses the JSF component tree to do all the work.

Just collecting notes and sharing..
Source : stackoverflow.com posted by BalusC

Wednesday, June 6, 2012

Java Notes: Comparable dan Comparator

Comparable - java.lang package

@ this.compateTo(object o)
 same -> = 0
 less than -> <0
 greater than -> >0

Comparator - java.util package

@compare(object o1, object o2)
 same -> = 0
 less than -> <0
 greater than -> >0

Both are interface.
The different is "this" reference

Comparable is used by most java class like String, Date, Array, wrapper classes, etc
Comparable implement natural ordering of object.
If any object implements Comparable and collection of that object is either List or Array can be sorted automatically.

Oject that implement Comparable in Java can be used as keys in sorted map or elements in a sorted set. Eg. TreeSet, without specifiying any Comparator


Just collecting notes & sharing..
Please let me know if there are wrong statements in this article or a copy-paste one.

Thursday, May 17, 2012

Comparing Date in Java


import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class HashtableDemo {

    public static void main(String args[]) throws AssertionError, ParseException {

        DateFormat df = new SimpleDateFormat("dd-MM-yyyy");

        //comparing date using compareTo method in Java
        System.out.println("Comparing two Date in Java using CompareTo method");
        compareDatesByCompareTo(df, df.parse("01-01-2012"), df.parse("01-01-2012"));
        compareDatesByCompareTo(df, df.parse("02-03-2012"), df.parse("04-05-2012"));
        compareDatesByCompareTo(df, df.parse("02-03-2012"), df.parse("01-02-2012"));

        //comparing dates in java using Date.before, Date.after and Date.equals
        System.out.println("Comparing two Date in Java using Date's before, after and equals method");
        compareDatesByDateMethods(df, df.parse("01-01-2012"), df.parse("01-01-2012"));
        compareDatesByDateMethods(df, df.parse("02-03-2012"), df.parse("04-05-2012"));
        compareDatesByDateMethods(df, df.parse("02-03-2012"), df.parse("01-02-2012"));

        //comparing dates in java using Calendar.before(), Calendar.after and Calendar.equals()
        System.out.println("Comparing two Date in Java using Calendar's before, after and equals method");
        compareDatesByCalendarMethods(df, df.parse("01-01-2012"), df.parse("01-01-2012"));
        compareDatesByCalendarMethods(df, df.parse("02-03-2012"), df.parse("04-05-2012"));
        compareDatesByCalendarMethods(df, df.parse("02-03-2012"), df.parse("01-02-2012"));

    }

    public static void compareDatesByCompareTo(DateFormat df, Date oldDate, Date newDate) {
        //how to check if date1 is equal to date2
        if (oldDate.compareTo(newDate) == 0) {
            System.out.println(df.format(oldDate) + " and " + df.format(newDate) + " are equal to each other");
        }

        //checking if date1 is less than date 2
        if (oldDate.compareTo(newDate) < 0) {
            System.out.println(df.format(oldDate) + " is less than " + df.format(newDate));
        }

        //how to check if date1 is greater than date2 in java
        if (oldDate.compareTo(newDate) > 0) {
            System.out.println(df.format(oldDate) + " is greater than " + df.format(newDate));
        }
    }

    public static void compareDatesByDateMethods(DateFormat df, Date oldDate, Date newDate) {
        //how to check if two dates are equals in java
        if (oldDate.equals(newDate)) {
            System.out.println(df.format(oldDate) + " and " + df.format(newDate) + " are equal to each other");
        }

        //checking if date1 comes before date2
        if (oldDate.before(newDate)) {
            System.out.println(df.format(oldDate) + " comes before " + df.format(newDate));
        }

        //checking if date1 comes after date2
        if (oldDate.after(newDate)) {
            System.out.println(df.format(oldDate) + " comes after " + df.format(newDate));
        }
    }

    public static void compareDatesByCalendarMethods(DateFormat df, Date oldDate, Date newDate) {

        //creating calendar instances for date comparision
        Calendar oldCal = Calendar.getInstance();
        Calendar newCal = Calendar.getInstance();

        oldCal.setTime(oldDate);
        newCal.setTime(newDate);

        //how to check if two dates are equals in java using Calendar
        if (oldCal.equals(newCal)) {
            System.out.println(df.format(oldDate) + " and " + df.format(newDate) + " are equal to each other");
        }

        //how to check if one date comes before another using Calendar
        if (oldCal.before(newCal)) {
            System.out.println(df.format(oldDate) + " comes before " + df.format(newDate));
        }

        //how to check if one date comes after another using Calendar
        if (oldCal.after(newCal)) {
            System.out.println(df.format(oldDate) + " comes after " + df.format(newDate));
        }
    }
}

Output:

Comparing two Date in Java using CompareTo method
01-01-2012 and 01-01-2012 are equal to each other
02-03-2012 is less than 04-05-2012
02-03-2012 is greater than 01-02-2012
Comparing two Date in Java using Date's before, after and equals method
01-01-2012 and 01-01-2012 are equal to each other
02-03-2012 comes before 04-05-2012
02-03-2012 comes after 01-02-2012
Comparing two Date in Java using Calendar's before, after and equals method
01-01-2012 and 01-01-2012 are equal to each other
02-03-2012 comes before 04-05-2012
02-03-2012 comes after 01-02-2012


Source: roseIndia.net

Just collecting notes & sharing..

Sunday, May 13, 2012

ConcurrentHashMap and hashTable

So what is the difference between hashtable and ConcurrentHashMap , both can be used in multithreaded environment but once the size of hashtable becomes considerable larg,e performance degrade because for iteration it has to be locked for longer duration.

Since ConcurrentHashMap indroduced concept of segmentation , how large it becomes only certain part of it get locked to provide thread safety so many other readers can still access map without waiting for iteration to complete.

In Summary ConcurrentHashMap only locked certain portion of Map while Hashtable lock full map while doing iteration.

Just collecting notes and sharing..
Please let me know if there're wrong statements in this article or copy-paste one.

Sunday, March 4, 2012

Java Notes: Lenient


Class Hierarchy
 
java.lang.Object
  extended byjava.text.Format
      extended byjava.text.DateFormat

There is one method called : setLenient(boolean lenient)

setLenient() : is use to skip calculating date from undefined date but with correct format.

ex. 29/02/2001 doesn't throw an error but will change to 01/03/2001 if setLenient method to TRUE.
Remember there's no 29 february in 2001 years coz it is not a leap year (Syamsiah year).
But, if u don't wanna be like that, use setLenient method to FALSE

Sometimes, this small thing can trouble us if we implemented wrongly.

Just collecting notes and sharing..
Please let me know if there are wrong statements in this article or copy-paste one.

Saturday, January 14, 2012

Common Keyword OOP (Static, Final, Abstract)

Di java dan C# (karena cuman didalam bahasa itu yang saya tau), terdapat keyword:

final menunjukkan bahwa class/method/variable yang dideclare dengan keyword final tidak dapat di override ataupun diubah valuenya (khusus untuk variable). Keyword final tidak dapat digabungkan dengan keyword abstract, karena sifatnya bertentangan (compile-error).

Karakteristik final:
- Biasanya digunakan untuk deklarasi konstan digabungkan dengan static keyword. Contoh: public static final MOVE = 1;
- Pengubahan value terhadap variable final; override dan overloading method; pewarisan/inheritance final class akan terjadi compile-error.

abstract menunjukkan bahwa class/method (agak lupa abstract variable ada di C# apa tidak) bersifat abstrak yang memaksa subclass / child nya untuk mengimplementasi method/class tersebut, jika tidak maka akan terjadi compile-error.

Karakteristik abstract:
- Harus di-implemen / di override oleh subclass / child nya, jika tidak akan compile error.
- Untuk abstract class, memiliki karakteristik yang serupa dengan interface tapi tidak sama.
- Tidak ada abstract variable dalam Java. (CMIIW)
- abstract class dapat memiliki konkrit method (tidak abstract), ini merupakan salah satu pembeda dengan interface.

Dahulu saya paling kesulitan memahami static keyword, namun beruntung sekarang saya sudah cukup paham tentang static, sebelum itu anda harus paham istilah dibawah ini:

instance = representasi/contoh/bentuk dari blueprint yang ada. Contohnya seperti Budi adalah representasi dari Manusia.
instantiate = istilah dari pembuatan untuk 1 instance.

static menunjukkan bahwa class/method/variable yang didefinisikan sebagai static hanya memiliki 1 instance untuk semua. Contohnya adalah dalam pembuatan object X terhadap class HURUF (1 atau lebih object), hanya akan ada 1 instance static method/variable yang dibuat/digenerate untuk 1 object tersebut. Method/variable static tsb adalah milik class HURUF, bukan milik object X, sehingga semua object akan mengakses 1 instance static yang sama milik class HURUF.
static sangat sering digunakan

Karakteristik static:
-  static keyword sering digabungkan dengan final untuk pembuatan konstan.
- Class dapat bersifat static, namun setiap member class harus bersifat static (mengikuti aturan dan fungsi dari static keyword), tidak mungkin bukan class yang hanya ada 1 instance dalam JVM, tetapi member class nya bisa lebih dari 1 instance?
- static metod tidak dapat mengakses non-static method/variable.
- static method dapat mengakses static method/variable.
- Untuk mengakses non-static method/variable, harus melakukan instantiate terlebih dahulu.

Prinsip diatas sesuai dengan fungsi dari static keyword. Bukankah sangat aneh bahwa 1 instance yang konkrit (static) memiliki instance yang tidak konkrit / belum jelas? untuk mengaksesnya maka harus dilakukan instantiated terlebih dahulu.
 
Semoga informasi ini berguna untuk anda.

Jika ada salah, mohon koreksinya :)
Maksud hati hanya mao sharing yang saya tau kok :D

Sunday, December 25, 2011

Mutable, Immutable, Thread Safe, Not-Thread Safe

Just notes:

Mutable adalah objek yang ketika dibuat (instantiate), dapat dirubah isinya.
Immutable adalah kebalikan dari Mutable, ketika sudah di instantiated maka objek tersebut tidak dapat dirubah isinya. Contoh paling umum adalah objek String.

Contoh pada Java, kita harus berhati-hati dalam menggunakan String karena objek ini sifatnya immutable. Pada saat anda mendeklarasikan String kata = "Saya immutable", JVM akan membuat 1 objek immutable.
Ketika anda melakukan perubahan: kata = "Saya mutable" anda sebenarnya melakukan pembuatan objek baru lagi dengan variable "kata" dan isi "Saya mutable" namun pada alokasi memori yang berbeda dari variable sebelumnya. Jika terlalu banyak operasi seperti itu, dapat mempengaruhi performance.



Jika anda akan melakukan banyak perubahan atau penambahan kalimat pada String objek, biasakan menggunakan class StringBuilder atau StringBuffer, lalu pada akhir manipulasi tersebut ubah menjadi String.

Perbedaan StringBuilder dan StringBuffer hanya pada Thread Safe (String Buffer) dan Not-Thread Safe (String Builder).

Thread Safe adalah konsep yang menjelaskan jika terdapat 1 resource yang digunakan bersama pada satu waktu (shared resource) tidak memberikan hasil yang berbeda / tidak sinkron. Thread Safe dapat diartikan dengan synchronization. Sehingga terdapat aksi wait() terhadap resource yang dipegang oleh banyak thread.

Not-Thread Safe adalah kebalikan dari Thread Safe, jika ada 2 thread yang menggunakan 1 resource (shared resource) maka hasil/value yang diberikan bisa berbeda/tidak sinkron, tergantung siapa yang lebih dahulu mememegang resource tsb (hold / lock the resource).

Contoh kasus seperti ini:
Misal ada Objek X, resource A, resource B, perintah 1-2 pada Objek X.

1. Objek X di akses oleh dua thread A dan B
2. Objek X dipegang oleh A, melakukan 1 perintah terhadapa objek X, ketika selesai nilai Objek X berubah.
3. Objek X kemudian diakses oleh B setelah setelah perintah 1 diekseskusi A, objek X nilainya akan berubah setelah dieksekusi oleh B (perintah 1 diekseskusi oleh B).
4. Karena thread A agak lama, maka B tetap mengakses objek X dan mengeksekusi perintah 2 terhadap objek X, nilai objek X berubah. 
5. Objek X kemudian diakses kembali oleh thread A untuk mengeksekusi perintah 2, value apa yang diperoleh oleh A pada saat diakses kali ini?

- Jawaban tergantung pada Thread Safe dan Not Thread Safe.
Karena alokasi objek X terdapat pada alamat memori yang sama, maka pada langkah 5 nilai sebenarnya adalah: objek X setelah diekseskusi oleh B.
Jika Thread Safe, maka A akan membaca nilai objek X dimana dia terakhir diubah oleh B.
Jika, Not Thread Safe maka nilai objek X yang dibaca adalah nilai objek X yang terakhir diubah oleh A.

Semoga penjelasan ini bisa dimengerti.
Sebenarnya lebih enak pakai gambar :D

Jika ada salah, mohon koreksinya :) Maksud hati hanya mao sharing yang saya tau kok :D

Saturday, December 3, 2011

Calendar dan Date (Part 1)

Tanggal merupakan hal sangat penting dalam aplikasi-aplikasi bisnis. Java menyediakan Calendar class sebagai utilitas untuk memanipulasi tanggal. Date class telah ditinggalkan oleh Java karena banyak mengandung bug, walaupun begitu Calendar class juga memiliki beberapa bug namun nampaknya sudah diperbaiki pada Java 7.

Saya masih sangat lemah dalam manipulasi tanggal, karena itu saya mencoba untuk merangkum beberapa snippet code yang mungkin membantu mengingat memory saya (walaupun dapat dilakukan dengan googling dan search ke oracle java docs)

Hirarki Class :
java.lang.Object
   java.util.Calendar

java.lang.Object
  java.text.Format
     java.text.DateFormat
         java.text.SimpleDateFormat 


Menampilkan tanggal hari ini:


public static void main (String [] args) {
    //menginisialisasi calendar dan mendapatkan tanggal dan waktu berdasarkan default locale dan timezone.
    Calendar now = Calendar.getInstance();
    // return Date object dari Calendar yang di instantiate, ini berguna untuk manipulasi ke String
    Date date = now.getTime();

    // dahulu anda dapat menginisialisasi seperti ini, namun tidak disarankan karena Date Class di Java sudah ditinggalkan, sebagai gantinya menggunakan Calendar.
    // date = date.now(); 

   // melakukan inisialisasi dan memberi date pattern, hanya date pattern yang didefinisikan yang akan dikenal oleh SimpleDateFormat.

   DateFormat df= new SimpleDateFormat("dd-mmm-yyyy");
    // df.format(date) akan me-return StringBuffer, karena itu harus diubah menjadi String

   String datestring = df.format(date).toString().toUpper();
   System.out.println (datestring);

   date = df.parse("15-Feb-2012");  // return date object
   System.out.println (df.format(date).toString() );


 }

Akan show (tanggal hari ini) contohnya : 11-NOV-2011 dan 15-Feb-2012

Keterangan:
date-pattern :
"dd.mm.yyyy", "mm/dd/yyyy", 
"E, dd MMM yyyy HH:mm:ss Z" (Tue, 03 Jan 2012 21:30:45 +0153), "EEEE, dd MMMM yyyy HH:mm:ss zzzz" (Tue, 03 Jan 2012 15:30:45 India Standard Time), 
dll. Lihat JavaDoc untuk lengkapnya.

Snippet diatas hanya secara sederhana menjelaskan konversi Date menjadi String dan String menjadi date berdasarkan format pattern yang telah sesuai. Mungkin berikutnya adalah manipulasi tanggal dengan Calendar class.

To be continued


Java Doc reference:
http://docs.oracle.com/javase/7/docs/api/java/util/Calendar.html
http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html


Jika ada salah, mohon koreksinya :)
Maksud hati hanya mao sharing yang saya tau kok :D

Monday, May 30, 2011

Common Keyword OOP (Static, Final, Abstract)

Di java dan C# (karena cuman didalam bahasa itu yang saya tau), terdapat keyword:

final menunjukkan bahwa class/method/variable yang dideclare dengan keyword final tidak dapat di override ataupun diubah valuenya (khusus untuk variable). Keyword final tidak dapat digabungkan dengan keyword abstract, karena sifatnya bertentangan (compile-error).

Karakteristik final:
- Biasanya digunakan untuk deklarasi konstan digabungkan dengan static keyword. Contoh: public static final MOVE = 1;
- Pengubahan value terhadap variable final; override dan overloading method; pewarisan/inheritance final class akan terjadi compile-error.

abstract menunjukkan bahwa class/method (agak lupa abstract variable ada di C# apa tidak) bersifat abstrak yang memaksa subclass / child nya untuk mengimplementasi method/class tersebut, jika tidak maka akan terjadi compile-error.

Karakteristik abstract:
- Harus di-implemen / di override oleh subclass / child nya, jika tidak akan compile error.
- Untuk abstract class, memiliki karakteristik yang serupa dengan interface tapi tidak sama.
- Tidak ada abstract variable dalam Java. (CMIIW)
- abstract class dapat memiliki konkrit method (tidak abstract), ini merupakan salah satu pembeda dengan interface.

Dahulu saya paling kesulitan memahami static keyword, namun beruntung sekarang saya sudah cukup paham tentang static, sebelum itu anda harus paham istilah dibawah ini:

instance = representasi/contoh/bentuk dari blueprint yang ada. Contohnya seperti Budi adalah representasi dari Manusia.
instantiate = istilah dari pembuatan untuk 1 instance.

static menunjukkan bahwa class/method/variable yang didefinisikan sebagai static hanya memiliki 1 instance untuk semua. Contohnya adalah dalam pembuatan object X terhadap class HURUF (1 atau lebih object), hanya akan ada 1 instance static method/variable yang dibuat/digenerate untuk 1 object tersebut. Method/variable static tsb adalah milik class HURUF, bukan milik object X, sehingga semua object akan mengakses 1 instance static yang sama milik class HURUF.
static sangat sering digunakan

Karakteristik static:
-  static keyword sering digabungkan dengan final untuk pembuatan konstan.
- Class dapat bersifat static, namun setiap member class harus bersifat static (mengikuti aturan dan fungsi dari static keyword), tidak mungkin bukan class yang hanya ada 1 instance dalam JVM, tetapi member class nya bisa lebih dari 1 instance?
- static metod tidak dapat mengakses non-static method/variable.
- static method dapat mengakses static method/variable.
- Untuk mengakses non-static method/variable, harus melakukan instantiate terlebih dahulu.

Prinsip diatas sesuai dengan fungsi dari static keyword. Bukankah sangat aneh bahwa 1 instance yang konkrit (static) memiliki instance yang tidak konkrit / belum jelas? untuk mengaksesnya maka harus dilakukan instantiated terlebih dahulu.
 
Semoga informasi ini berguna untuk anda.

Jika ada salah, mohon koreksinya :)
Maksud hati hanya mao sharing yang saya tau kok :D