26 Eylül 2017 Salı

YearMonth Sınıfı

Giriş
Bu sınıf saat dilimi bilmez. Bu sınıf ile Month Sınıfı benzeşiyorlar.

Bu sınıf LocalDate'ten farklı olarak gün bilgisine sahip değildir. Gün bilgisini atayıp LocalDate elde etmek için at() metodu kullanılır.

Bu sınıf value-based bir sınıf. Açıklaması şöyle
This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of YearMonth may have unpredictable results and should be avoided
at metodu
Örnek
Şöyle yaparız.
YearMonth lastDayOfPreviousMonth = yearMonth.atDay(1).minusDay(1);
Örnek
Şöyle yaparız.
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MM-yyyy");
YearMonth ym = YearMonth.parse("09-2017", fmt);
LocalDate dt = ym.atDay(1); // choose whatever day you want
atEndOfMonth metodu
Şöyle yaparız.
YearMonth firstDayOfNextMonth = yearMonth.atEndOfMonth().plusDays(1);
format metodu
Şöyle yaparız.
Locale locale = Locale.CANADA_FRENCH;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "MMM yyyy" , locale );
String output = yearMonth.format ( formatter );
Çıktı olarak fransızca ay ve yıl alırız.
déc. 2015
getMonth metodu
Month nesnesi döner. Şöyle yaparız.
String monthName = yearMonth.getMonth()
getYear metodu
int döner. Şöyle yaparız.
yearMonth.getYear()
minusMonths metodu
Şöyle yaparız.
YearMonth yearMonth = YearMonth.now().minusMonths(1);
now metodu
Şöyle yaparız.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
YearMonth yearMonth = YearMonth.now( zoneId );

25 Eylül 2017 Pazartesi

PropertyChangeListener Arayüzü

Örnek ver

PropertyChangeEvent Sınıfı

Örnek ver

Observable Sınıfı

Giriş
Observable sınıfı ve Observer arayüzü beraber kullanlır. Observable sınıfı arayüz olmadığı için nesnemizi bir kere kalıtınca başka bir sınıftan kalıtma imkanı ortadan kalkıyor.

Serializable
Bu sınıfı Serializable değil !

Java 9
Bu sınıf Java 9 ile deprecate edildi. Açıklaması şöyle
The event model supported by Observer and Observable is quite limited, the order of notifications delivered by Observable is unspecified, and state changes are not in one-for-one correspondence with notifications. For a richer event model, consider using the java.beans package. For reliable and ordered messaging among threads, consider using one of the concurrent data structures in the  java.util.concurrent package. For reactive streams style programming, see the Flow API.
java.beans paketindeki PropertyChangeEvent ve PropertyChangeListener kullanılablir.

addObserver metodu
Şöyle yaparız.
public class SomeView implements Observer{

 private MyObservable controller;

 public SomeView (MyObservable ctrl)
 {
   this.controller= ctrl;
   ctrl.addObserver(this);
 }

 public void update (Observable o,Object arg)
 {
   if (o==controller)
   System.out.println("Update detected");
  }

}
notifyObservers metodu
Şöyle yaparız.
public class MyObservable extends Observable{

  public void doSomething()
  {
    //dostuff
    setChanged();
    notifyObservers();
  }

}

22 Eylül 2017 Cuma

Remote Method Invocation - RMI

Giriş
Remote Method Invocation (RMI) Java'nın en başından beri olan bir teknoloji.

RMI Hangi Protokolü Kullanır
RMI JRMP (Java Remote Method Protocol) protokolünü kullanır.

JAX-RS @PathParam Anotasyonu

Giriş
Şu satırı dahil ederiz.
import javax.ws.rs.PathParam;
@QueryParam ve @CookieParam anotasyonları ile kardeştir.

Get İsteği ve PathParam
URL'deki path isminden sonra gelen parametrelere erişim sağlar

Örnek
Şöyle yaparız.
@Path("/hello")
public class HelloWorldService {

  @GET
  @Path("{param}")
  public Response getMsg(@PathParam("param") String msg) {

    String output = "Jersey say : " + msg;

    return Response.status(200).entity(output).build();

  }
}
war ismi RestTest olsun. java paket ismi ise rest olsun.Çağırmak için şöyle yaparız.
http://localhost:8080/RestTest/rest/hello/Tuan

JAX-RS @QueryParam Anotasyonu

Giriş 
Şu satırı dahil ederiz.
import javax.ws.rs.QueryParam;
@PathParam ve @CookieParam anotasyonları ile kardeştir.

Get İsteği ve QueryParam
URL'deki ? karakterinden sonra gelen parametrelere erişimi sağlar

Örnek
İstek şöyle olsun.
/query?Country=US&City=Boston&City=Chicago
Açıklaması şöyle
JAX-RS supports multiple query parameters of the same name by mapping them to a Collection in your endpoint as follows:
Şöyle yaparız.
@GET
@Path("/query")
public String queryValues(@QueryParam("Country") List<String> countries,
                          @QueryParam("City") List<String> cities) {
  ...
}
Örnek
İstek şöyle olsun
http://www.example.com/service/endpoint?queryA=foo&queryB=bar
Şöyle yaparız. Sonuç olarak Json döner.
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;

@Path("/service")
@Produces("application/json")
public interface ServiceInterface {

  @Path("/endpoint")
  @GET
  public Response getEndpoint(
          @QueryParam("queryA") String first,
          @QueryParam("queryB") String second);

}

StandardCharsets Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.nio.charset.StandardCharsets;
Alanlar
Şöyle yaparız.
StandardCharsets.UTF_8

20 Eylül 2017 Çarşamba

Timestamp Sınıfı

Giriş
Bu sınıf java.sql.Timestamp isim alanında. Java 8'den itibaren bu sınıf yerine Instant.now() kullanılırsa daha iyi.

Timestamp sınıfı saat dilimi bilgisinden mahrumdur. Zamanı "yyyy-mm-dd hh:mm:ss" formatında kaydeder.

Kalıtım
Şöyledir
Zaman Dilimi
Saat dilimine göre karışıklıklardan korunmak için şu adımları izleriz.

1. Veritabanında saatler her zaman UTC olarak saklanır.
2. ResultSet sınıfının getTimeStamp() metodu ile saat okunur. PreparedStatement sınıfının setTimeStamp() metodu ile saat kaydedilir.
3. TimeStamp toInstant() metodu ile Instant nesnesine dönüştürülür.
4. Instant nesnesi ZonedDateTime ile kullanıcıya gösterilmek üzere saat dilimine göre değiştirilir.

Sütun Tipi
Oracle'da DATE sütun tipi kullanılabilir.

constructor
Şöyle yaparız
ps = conn.prepareStatement('insert into your_table (date_col, ...) values (?, ...)');
ps.setTimestamp(1, new java.sql.Timestamp(System.currentTimeMillis()));
cosntructor - Deprecated
year, month,date ... şeklindeki constructor kullanılmıyor. Onun yerine şöyle yaparız
Timestamp timestamp = Timestamp.valueOf("2012-01-12 12:45:56");
//Timestamp timestamp = new Timestamp(3912, 2, 12, 12, 45, 56, 0);
toLocalDateTime metodu
Şöyle yaparız.
Timestamp ts = ...;
LocalDateTime ldt = ts.toLocalDateTime();
toInstant metodu
Nesneyi Java 8 ile çalışabilmek için Instant'a dönüştürür.

toString metodu
timestamp.toString() yapınca yerel saati alırız. Aşağıdaki kodu çalıştırınca
Instant inst = LocalDate.now();
Timestamp ts = Timestamp.from(inst);
System.out.println(ts);
Çıktı olararak yerel saati alırız.
2015-10-19 11:00:00.0
Eğer TimeStamp içindeki Epoch'tan beri geçen süreyi almak istersek şöyle yaparız.
System.out.println(ts.getTime());
Bu sefer çıktı olarak sayı alırız.
1445212800000
Anladığım kadarıyla bazı veritabanlarında bulunan sütun tiplerindeki saat dilimi bilgisi başka şekillerde elde ediliyor.

valueOf metodu - LocalDateTime
Instant nesnesini Timestamp nesnesine çevirir. Şöyle yaparız.
Timestamp ts = Timestamp.valueOf (instant);
Şöyle yaparız.
LocalDateTime locDateTime = ...;
Timestamp ts =  Timestamp.valueOf(locDateTime));