Java Static Import Kavramı

Java Static Import
Java’da pek fazla bilinmeyen, çok da önemli olmayan bir konuya değinmek istedim static kavramını anlatıp bundan hiç bahsetmemiş olduğumu fark ettiğim zaman…
Python da çalışmış olanlar bilirler, kütüphane import etme sisteminde şöyle birkaç yöntem vardır python’da:

import math

from math import sqrt

from math import *

____

Buna benzer bir özellik Java’da da mevcuttur. İşte buna static import diyoruz. Oracle’ın bununla ilgili sayfasından bir kısım çeviriyle durumu anlatmaya çalışayım.

Class’ların static metodlarına ulaşmak için programcı, class ismini referans olarak belirtmelidir. classIsmi.metodIsmi şeklinde kullanmalıdır. örneğin;

double r = Math.cos(Math.PI * theta);

Bunu kolaylaştırmak için insanlar bazen static elemanları bir interface’e koyup buradan kullanmayı tercih ederler. Fakat bu kötü bir fikirdir. Aslında bu kötü fikrin bir ismi de var. Constant Interface Antipattern  . Bir class’ı sadece başka bir class’ın static elemanları için kullanmak sadece küçük bir detaydır. Bir class bir interface’i implements ettiğinde (uyguladığında), bu class’ın public API’si durumuna gelir. Kodlama detayları public API’lere sızmamalıdır.

static import yapısı, static elemanlara, bunları kapsayan tip olmadan ulaşabilmeye izin verir. Programımız, ya elemanları teker teker import eder;
import static java.lang.Math.PI;
ya da topluca import eder.
import static java.lang.Math.*;
Bunlar import edildikten sonra kullanım şu şekilde yapılır.

double r = cos(PI * theta);

static import bildirimi normal import’a benzerdir. Normal import package’lardaki class’ları import ederken, package ve class belirtmeden kullanmaya izin vererek, class içindeki static elemanları import eder.

Yani, ne zaman static import kullanmalıyız?
Olabildiğince kaçınarak. Sadece, kullanmadığımızda gereksiz yerel kopyalar oluşturmak zorunda kalıyorsak ya da inheritance ile ilgili yanlış bir kullanıma yol açıyorsa kullanmalıyız. (bkz. Constant Interface Antipattern). Diğer bir deyişle, bir veya birkaç tane class’ın static elemanlara sık sık ulaşmanız gerektiğinde kullanın. Eğer bu özelliği aşırı kullanırsanız, programınızı okunmaz hale getirir. namespaceini import ettiğiniz birçok static elemanla kirletir. Kodunuzu okuyanlar (siz de dahil, birkaç ay sonra düşünün) hangi class’tan hangi static elemanın geldiğini bilmiyor olacak. Bütün static elemanları import etmek özellikle okunabilirliğe zararlıdır. Eğer bir veya iki elemana ihtiyaç duyuyorsanız, sadece onları import edin. Uygun kullanıldığında, static import; programınızı daha rahat anlaşılır, standart fazlalıklardan (class isimleri) arındırılmış bir hale getirir.

Selection_023

___________________________

e1
Yeni başlayanlara anlatırken her zaman, System.out.println (“Hello World”); tabiri problem olur. static import bu konuda fayda sağlayabilir.
Bu durumda artık System bir class oluyor. System.out PrintSteam türünde static bir alan… Bu da başka bir sınıf. Statik nedir peki? (Televizyon, sinyal alamayınca yaptığı şeye de denir) Kurutma makinemizde bile statik olmasını istemiyoruz kodumuzda neden isteyelim, değil mi? Tabii ki alacağımız veri final değilse… Yani biz bunu değiştiremeyeceksek..
Keza, matematiksel ifadeler gerçekten de böyleyken
sin(angle * PI / 180);
alttakinden daha hoş görünmüyor mu?
Math.sin(angle * Math.PI / 180)
Evet, en azından bu kadarcığını, trigonometrik ifadeleri biliyoruz.
Bu paragrafı bir java sitesinden aldım. Buna cevabı örneklerle inceleyelim. Arkadaşımız şunu öneriyor;

Selection_025

İlk kez, static import özelliğinin açıklamasını okuduğumda biraz rahatsız olmuştum bundan.. Neyin nerede olduğunu, kolaylıkla görebiliyorduk bu özelliği kullanmadan. Bu da kodu anlamada çok yardımcı oluyordu. Daha çok static import kullanıldığında, neyin nereden geldiğini anlamak gitgide zorlaşır. Diğer yandan, System.out.println ifadesinin daha az karakter içeriyor olmasını gerçekten çok istediğim zamanlar da oldu. Önemli mi? Hayır. Herkes bu ifadenin neye yaradığını biliyor. Çoğu insan bunun üstüne düşünmez bile. Biri bunu static import ile kullandığında ben daha rahatsız olurdum, çünkü bana, output streaminde bir değişiklik yapılmış olabileceği hissini veriyor.
Mesela;

Selection_021

Burada hem faydasını hem de zararını bir arada görebilirsiniz..  Output’u unutmayalım.

Selection_022

err değişkeni gördüğünüz gibi karışıklığa neden olabiliyor…

Daha farklı bir örnekle tekrar inceleyelim.

Selection_024

Kodlar:
https://mega.nz/#!oI9GhYpL!iFfVbjemkSF40hEdHRkVZAgmmdfglRgRftCTW3jdTLU

_________________________________________________
Kaynaklar
http://www.java2s.com/Code/Java/Language-Basics/JavastaticimportSystemoutanderr.htm
http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s