Java 9 - Hızlı Kılavuz
JAVA 9 (diğer adıyla jdk 1.9), JAVA programlama dili geliştirmenin önemli bir sürümüdür. İlk sürümü 21 Eylül 2017'de yayınlandı. Java 9 sürümünün ana hedefleri:
JDK ve Java Standard Edition platformunu, küçük bilgi işlem cihazlarına iyi bir şekilde ölçeklenebilme anlamında modüler tabanlı hale getirmek.
JDK ve Java Uygulamalarının genel güvenliğini iyileştirmek için.
JAVA SE ve EE platformları için java kod kitaplıklarının ve büyük uygulamaların derleme sürecini ve bakımını kolaylaştırmak.
Java Platformu için hem Platform hem de JDK'ya kolayca uygulanabilen standart bir modül sistemi tasarlamak ve uygulamak.
Yeni özellikler
Java 8'e eklenen 90'dan fazla geliştirme vardır, en önemlileri aşağıda belirtilmiştir -
Module - Adlandırılmış, kendi kendini tanımlayan bir kod ve veri koleksiyonu olan modül olarak tanıtılan yeni bir Java programlama bileşeni türü.
REPL (JShell) - Java platformuna Read-Eval-Print Loop (REPL) özelliği eklendi.
HTTP 2 Client - web yuvalarını ve HTTP 2 akışlarını ve sunucu push özelliklerini destekleyen yeni HTTPClient API.
Improved JavaDocs- HTML5 çıktı oluşturmayı destekler. Oluşturulan API belgelerine bir arama kutusu sağlar.
Multirelease JAR - JAR formatını, sınıf dosyalarının birden çok, Java sürümüne özgü sürümünün tek bir arşivde bir arada bulunabilmesi için geliştirir.
Collection Factory Methods - Bu koleksiyonların değişmez örneklerini oluşturmak için Liste, Ayarlama ve Harita arabirimleri için yeni statik fabrika yöntemleri.
Private Interface Methods - Özel ve özel statik yöntemlerle geliştirilmiş arayüzler.
Process API Improvements - İşletim sistemi süreçlerini kontrol etmek ve yönetmek için geliştirilmiş API.
Stream API Improvements - Gelen nesne serileştirme verisi akışlarının filtrelenmesine izin vererek gelişmiş güvenlik ve sağlamlık.
Try With Resources improvement - Artık son değişkenler, kaynakları dene deyiminde kaynaklar olarak kullanılabilir.
Enhanced @Deprecated Annotation - @Deprecated ek açıklama, bir API'nin durumu ve amaçlanan kullanımı hakkında daha fazla bilgi sağlamak için yenilendi.
Inner Class Diamond Operator - Çıkarılan türün bağımsız değişken türü gösterilebiliyorsa, elmas operatörünün anonim sınıflarla kullanılmasına izin verin.
Optional Class Improvements - java.util.Optional sınıfına yeni kullanışlı yöntemler eklendi.
Multiresolution Image API - Farklı çözünürlüklere sahip bir dizi görüntünün tek bir çok çözünürlüklü görüntüde kapsüllenmesini destekler.
CompletableFuture API improvements - CompletableFuture sınıfının zaman uyumsuz mekanizmaları, işlem ProcessHandle.onExit yöntemiyle çıktığında bir eylem gerçekleştirebilir.
Lightweight JSON - Java 9'da json aracılığıyla belge ve veri akışlarını kullanmak ve oluşturmak için sunulan hafif bir API.
Reactive Streams API - Java 9'da reaktif programlamayı desteklemek için Java SE 9'da yeni bir Reactive Stream API tanıtıldı.
Yerel Ortam Kurulumu
Java programlama dili için kendi ortamınızı kurmak istiyorsanız, bu bölüm tüm süreç boyunca size yol gösterir. Java ortamınızı kurmak için lütfen aşağıda verilen adımları izleyin.
Java SE ücretsiz olarak indirilebilir. İndirmek için buraya tıklayın , lütfen işletim sisteminizle uyumlu bir sürümü indirin.
Java'yı indirmek için talimatları izleyin ve .exeMakinenize Java yüklemek için. Java'yı makinenize yükledikten sonra, ortam değişkenlerini doğru yükleme dizinlerini gösterecek şekilde ayarlamanız gerekir.
Windows 2000 / XP için Yolu Ayarlama
Java'yı c: \ Program Files \ java \ jdk dizinine kurduğunuzu varsayarsak -
"Bilgisayarım" ı sağ tıklayın ve "Özellikler" i seçin.
"Gelişmiş" sekmesinin altındaki "Ortam değişkenleri" düğmesini tıklayın.
Şimdi, 'Yol' değişkenini düzenleyin ve Java yürütülebilir dizinin yolunu sonuna ekleyin. Örneğin, yol şu anda olarak ayarlanmışsa
C:\Windows\System32
, aşağıdaki şekilde düzenleyin
C:\Windows\System32;c:\Program Files\java\jdk\bin
Windows 95/98 / ME için Yolu Ayarlama
Java'yı c: \ Program Files \ java \ jdk dizinine kurduğunuzu varsayarsak -
'C: \ autoexec.bat' dosyasını düzenleyin ve sonuna aşağıdaki satırı ekleyin -
SET PATH = %PATH%;C:\Program Files\java\jdk\bin
Linux, UNIX, Solaris, FreeBSD için Yol Ayarlama
PATH ortam değişkeni, Java ikili dosyalarının kurulu olduğu yeri gösterecek şekilde ayarlanmalıdır. Bunu yapmakta sorun yaşıyorsanız, kabuk belgelerinize bakın.
Örneğin, kabuğunuz olarak bash kullanırsanız, aşağıdaki satırı satırınızın sonuna eklersiniz. .bashrc -
export PATH = /path/to/java:$PATH'
Popüler Java Editörleri
Java programları yazmak için bir metin düzenleyiciye ihtiyacınız var. Piyasada daha da karmaşık IDE'ler mevcuttur. En popüler olanlar aşağıda kısaca açıklanmıştır -
Notepad- Windows makinesinde, Not Defteri (bu eğitim için önerilir) veya WordPad gibi herhangi bir basit metin düzenleyiciyi kullanabilirsiniz. Notepad ++ aynı zamanda özellikleri geliştiren ücretsiz bir metin editörüdür.
Netbeans - Açık kaynak kodlu ve ücretsiz bir Java IDE'dir, buradan indirilebilir https://www.netbeans.org/index.html.
Eclipse - Ayrıca Eclipse açık kaynak topluluğu tarafından geliştirilen bir Java IDE'dir ve şu adresten indirilebilir: https://www.eclipse.org/.
IDE veya Entegre Geliştirme Ortamı, kaynak kodu düzenleyici, derleme araçları ve hata ayıklayıcılar gibi programlamaya yardımcı olacak tüm yaygın araçları ve olanakları sağlar.
Modül adı verilen yeni bir tür programlama bileşeni olan Java 9 tanıtıldı. Modül, kendi kendini tanımlayan bir kod ve veri koleksiyonudur ve onu tanımlayacak bir adı vardır.
Özellikleri
Modüller bileşeniyle, Java 9'da aşağıdaki geliştirmeler eklenmiştir -
Yeni bir isteğe bağlı aşama olan bağlantı süresi tanıtıldı. Bu aşama, derleme zamanı ile çalışma zamanı arasındadır. Bu aşamada, jlink aracını kullanarak özel bir çalışma zamanı görüntüsü oluşturarak bir dizi modül birleştirilebilir ve optimize edilebilir.
javac, jlink ve java, modüllerin tanımlarını daha da belirleyen modül yollarını belirtmek için ek seçeneklere sahiptir.
JAR biçimi, kök dizininde module-info.class dosyasını içeren modüler JAR olarak güncellendi.
Yerel kod ve yapılandırma dosyalarını içerebilen bir paketleme formatı (JAR'a benzer) JMOD formatı tanıtıldı.
Modül Oluşturma
Bir modül oluşturma adımlarını takip ederek com.tutorialspoint.greetings deyin.
Aşama 1
Bir C: \> JAVA \ src klasörü oluşturun. Şimdi, oluşturduğumuz modülün adıyla aynı olan bir com.tutorialspoint.greetings klasörü oluşturun.
Adım 2
Aşağıdaki kod ile C: \> JAVA \ src \ com.tutorialspoint.greetings klasöründe module-info.java oluşturun.
module-info.java
module com.tutorialspoint.greetings { }
module-info.java modül oluşturmak için kullanılan dosyadır. Bu adımda com.tutorialspoint.greetings adlı bir modül oluşturduk. Kural olarak, bu dosya, adı modül adıyla aynı olan klasörde bulunmalıdır.
Aşama 3
Modüle kaynak kodunu ekleyin. Aşağıdaki kodla C: \> JAVA \ src \ com.tutorialspoint.greetings \ com \ tutorialspoint \ greetings klasöründe Java9Tester.java oluşturun.
Java9Tester.java
package com.tutorialspoint.greetings;
public class Java9Tester {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
Geleneksel olarak, bir modülün kaynak kodu, modülün adı olan aynı dizinde yer alır.
4. adım
Bir C: \> JAVA \ mods klasörü oluşturun. Şimdi, oluşturduğumuz modülün adıyla aynı olan bir com.tutorialspoint.greetings klasörü oluşturun. Şimdi modülü mods dizinine derleyin.
C:/ > JAVA > javac -d mods/com.tutorialspoint.greetings
src/com.tutorialspoint.greetings/module-info.java
src/com.tutorialspoint.greetings/com/tutorialspoint/greetings/Java9Tester.java
Adım 5
Sonucu görmek için modülü çalıştıralım. Aşağıdaki komutu çalıştırın.
C:/ > JAVA > java --module-path mods -m com.tutorialspoint.greetings/com.tutorialspoint.greetings.Java9Tester
Burada modül yolu, modlar olarak modül konumunu sağlar ve -m ana modülü belirtir.
Çıktı
Konsolda aşağıdaki çıktıyı yazdıracaktır.
Hello World!
REPL, Oku-Değerlendir-Yazdır Döngüsü anlamına gelir. JShell ile java, REPL özelliğine sahiptir. REPL kullanarak, java tabanlı mantığı javac kullanarak derlemeden kodlayıp test edebilir ve hesaplamaların sonucunu doğrudan görebiliriz.
JShell'i çalıştırma
Komut istemini açın ve jshell yazın.
$ jshell
| Welcome to JShell -- Version 9-ea
| For an introduction type: /help intro
jshell>
JShell komutlarını görüntüleme
Jshell komutu çalışmaya başladığında / help yazın.
jshell> /help
| Type a Java language expression, statement, or declaration.
| Or type one of the following commands:
| /list [<name or id>|-all|-start]
| list the source you have typed
| /edit <name or id>
| edit a source entry referenced by name or id
| /drop <name or id>
| delete a source entry referenced by name or id
| /save [-all|-history|-start] <file>
| Save snippet source to a file.
| /open <file>
| open a file as source input
| /vars [<name or id>|-all|-start]
| list the declared variables and their values
| /methods [<name or id>|-all|-start]
| list the declared methods and their signatures
| /types [<name or id>|-all|-start]
| list the declared types
| /imports
| list the imported items
JShell komutunu çalıştırma
Jshell komutu çalışmaya başladığında / içe aktarır yazın ve kullanılan içe aktarmaları görün.
jshell> /imports
| import java.io.*
| import java.math.*
| import java.net.*
| import java.nio.file.*
| import java.util.*
| import java.util.concurrent.*
| import java.util.function.*
| import java.util.prefs.*
| import java.util.regex.*
| import java.util.stream.*
jshell>
JShell'de Hesaplamaları Çalıştırma.
JShell'de basit hesaplamalar yapmayı deneyin.
jshell> 3+1
$1 ==> 4 jshell> 13%7 $2 ==> 6
jshell> $2 $2 ==> 6
jshell>
JShell'de işlevler oluşturma ve kullanma
İnt'i alıp ikiye katlanmış değerini döndürmek için bir doubleled () işlevi oluşturun.
jshell> int doubled(int i){ return i*2;}
| created method doubled(int)
jshell> doubled(6)
$3 ==> 12
jshell>
JShell'den çıkılıyor
Yazın / çıkın.
jshell> /exit
| Goodbye
Java belgeleri, javadoc aracı kullanılarak oluşturulabilir. Şu anda html 4.0 formatında dokümantasyon üretmektedir. Java 9'da, komut satırı argümanlarında -html5 seçeneğini kullanarak html 5 formatında dokümantasyon üretebiliriz.
Eski stil java belgeleri
C: / JAVA klasöründeki aşağıdaki kodu göz önünde bulundurun.
Tester.java
/**
* @author MahKumar
* @version 0.1
*/
public class Tester {
/**
* Default method to be run to print
* <p>Hello world</p>
* @param args command line arguments
*/
public static void main(String []args) {
System.out.println("Hello World");
}
}
Şimdi dokümantasyonu oluşturmak için jdk 7'nin javadoc aracını çalıştırın.
C:\JAVA>javadoc -d C:/JAVA Tester.java
Loading source file tester.java...
Constructing Javadoc information...
Standard Doclet version 1.7.0_21
Building tree for all the packages and classes...
Generating C:\JAVA\Tester.html...
Generating C:\JAVA\package-frame.html...
Generating C:\JAVA\package-summary.html...
Generating C:\JAVA\package-tree.html...
Generating C:\JAVA\constant-values.html...
Building index for all the packages and classes...
Generating C:\JAVA\overview-tree.html...
Generating C:\JAVA\index-all.html...
Generating C:\JAVA\deprecated-list.html...
Building index for all classes...
Generating C:\JAVA\allclasses-frame.html...
Generating C:\JAVA\allclasses-noframe.html...
Generating C:\JAVA\index.html...
Generating C:\JAVA\help-doc.html...
C: / JAVA dizininde java dokümantasyon sayfasını oluşturacak ve aşağıdaki çıktıyı göreceksiniz.
Arama ve HTML5 desteğiyle yeni java belgeleri
Yeni belge türü oluşturmak için jdk 9'un javadoc aracını -html5 bayrağıyla çalıştırın.
C:\JAVA> javadoc -d C:/JAVA -html5 Tester.java
Loading source file Tester.java...
Constructing Javadoc information...
Standard Doclet version 9.0.1
Building tree for all the packages and classes...
Generating C:\JAVA\Tester.html...
Generating C:\JAVA\package-frame.html...
Generating C:\JAVA\package-summary.html...
Generating C:\JAVA\package-tree.html...
Generating C:\JAVA\constant-values.html...
Building index for all the packages and classes...
Generating C:\JAVA\overview-tree.html...
Generating C:\JAVA\index-all.html...
Generating C:\JAVA\deprecated-list.html...
Building index for all classes...
Generating C:\JAVA\allclasses-frame.html...
Generating C:\JAVA\allclasses-frame.html...
Generating C:\JAVA\allclasses-noframe.html...
Generating C:\JAVA\allclasses-noframe.html...
Generating C:\JAVA\index.html...
Generating C:\JAVA\help-doc.html...
D: / test dizininde güncellenmiş java dokümantasyon sayfasını oluşturacak ve aşağıdaki çıktıyı göreceksiniz.
Java 9'da, bir jar formatının, java sınıfının farklı sürümlerine sahip olacak şekilde geliştirildiği veya platforma göre kaynakların korunabileceği ve kullanılabileceği yeni bir özellik tanıtıldı. JAR'da, bir MANIFEST.MF dosyasının ana bölümünde Multi-Release: true girişi vardır. META-INF dizini ayrıca, alt dizinleri (Java 9 için 9'dan başlayarak) sürüme özgü sınıfları ve kaynak dosyalarını depolayan bir sürüm alt dizini içerir.
Bu örnekte, Tester.java dosyasının biri jdk 7 ve diğeri jdk 9 için olmak üzere iki sürümüne sahip olmak ve farklı jdk sürümlerinde çalıştırmak için çoklu sürüm jar kullanacağız.
Adımlar
Step 1- Bir c: / test / java7 / com / tutorialspoint klasörü oluşturun. Aşağıdaki içerikle Test.java oluşturun -
Tester.java
package com.tutorialspoint;
public class Tester {
public static void main(String[] args) {
System.out.println("Inside java 7");
}
}
Step 2- Bir c: / test / java9 / com / tutorialspoint klasörü oluşturun. Aşağıdaki içerikle Test.java oluşturun -
Tester.java
package com.tutorialspoint;
public class Tester {
public static void main(String[] args) {
System.out.println("Inside java 9");
}
}
Kaynak kodlarını derleyin.
C:\test > javac --release 9 java9/com/tutorialspoint/Tester.java
C:\JAVA > javac --release 7 java7/com/tutorialspoint/Tester.java
Çoklu yayın kavanozu oluşturun
C:\JAVA > jar -c -f test.jar -C java7 . --release 9 -C java9.
Warning: entry META-INF/versions/9/com/tutorialspoint/Tester.java,
multiple resources with same name
JDK 7 ile çalıştırın
C:\JAVA > java -cp test.jar com.tutorialspoint.Tester
Inside Java 7
JDK 9 ile çalıştırın
C:\JAVA > java -cp test.jar com.tutorialspoint.Tester
Inside Java 9
Java 9 ile, değişmez örnekler oluşturmak için Liste, Ayarlama ve Harita arayüzlerine yeni fabrika yöntemleri eklenmiştir. Bu fabrika yöntemleri, daha az ayrıntılı ve özlü bir şekilde bir koleksiyon oluşturmak için uygun fabrika yöntemleridir.
Koleksiyon oluşturmanın eski yolu
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class Tester {
public static void main(String []args) {
Set<String> set = new HashSet<>();
set.add("A");
set.add("B");
set.add("C");
set = Collections.unmodifiableSet(set);
System.out.println(set);
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list = Collections.unmodifiableList(list);
System.out.println(list);
Map<String, String> map = new HashMap<>();
map.put("A","Apple");
map.put("B","Boy");
map.put("C","Cat");
map = Collections.unmodifiableMap(map);
System.out.println(map);
}
}
Çıktı
Aşağıdaki çıktıyı yazdıracaktır.
[A, B, C]
[A, B, C]
{A=Apple, B=Boy, C=Cat}
Yeni Yöntemler
Java 9 ile List, Set ve Map arayüzlerine aşırı yüklenmiş muadilleriyle birlikte aşağıdaki yöntemler eklenir.
static <E> List<E> of(E e1, E e2, E e3);
static <E> Set<E> of(E e1, E e2, E e3);
static <K,V> Map<K,V> of(K k1, V v1, K k2, V v2, K k3, V v3);
static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)
Dikkat Edilmesi Gereken Noktalar
List ve Set arabirimleri için, (...) yöntemi 0 ila 10 parametre ve biri var args parametresi olacak şekilde aşırı yüklenmiştir.
Harita arayüzü için, (...) yöntemi 0 ila 10 parametreye sahip olacak şekilde aşırı yüklenmiştir.
Harita arayüzü için 10'dan fazla parametre olması durumunda, var args parametresini kabul etmek için ofEntries (...) yöntemi kullanılabilir.
Koleksiyon oluşturmanın yeni yolu
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.AbstractMap;
import java.util.Map;
import java.util.Set;
public class Tester {
public static void main(String []args) {
Set<String> set = Set.of("A", "B", "C");
System.out.println(set);
List<String> list = List.of("A", "B", "C");
System.out.println(list);
Map<String, String> map = Map.of("A","Apple","B","Boy","C","Cat");
System.out.println(map);
Map<String, String> map1 = Map.ofEntries (
new AbstractMap.SimpleEntry<>("A","Apple"),
new AbstractMap.SimpleEntry<>("B","Boy"),
new AbstractMap.SimpleEntry<>("C","Cat"));
System.out.println(map1);
}
}
Çıktı
Aşağıdaki çıktıyı yazdıracaktır.
[A, B, C]
[A, B, C]
{A=Apple, B=Boy, C=Cat}
{A=Apple, B=Boy, C=Cat}
Java 8'den önce, arayüzler aşağıdaki değişkenlere / yöntemlere sahip olabilir.
- Sabit değişkenler
- Soyut yöntemler
Dolayısıyla arayüzlerde yöntem uygulamasına veya daha kesin olarak Java 8'den önce varsayılan bir uygulamaya sahip olamayız. Örneğe bakın.
public class Tester {
public static void main(String []args) {
LogOracle log = new LogOracle();
log.logInfo("");
log.logWarn("");
log.logError("");
log.logFatal("");
LogMySql log1 = new LogMySql();
log1.logInfo("");
log1.logWarn("");
log1.logError("");
log1.logFatal("");
}
}
final class LogOracle implements Logging {
@Override
public void logInfo(String message) {
getConnection();
System.out.println("Log Message : " + "INFO");
closeConnection();
}
@Override
public void logWarn(String message) {
getConnection();
System.out.println("Log Message : " + "WARN");
closeConnection();
}
@Override
public void logError(String message) {
getConnection();
System.out.println("Log Message : " + "ERROR");
closeConnection();
}
@Override
public void logFatal(String message) {
getConnection();
System.out.println("Log Message : " + "FATAL");
closeConnection();
}
@Override
public void getConnection() {
System.out.println("Open Database connection");
}
@Override
public void closeConnection() {
System.out.println("Close Database connection");
}
}
final class LogMySql implements Logging {
@Override
public void logInfo(String message) {
getConnection();
System.out.println("Log Message : " + "INFO");
closeConnection();
}
@Override
public void logWarn(String message) {
getConnection();
System.out.println("Log Message : " + "WARN");
closeConnection();
}
@Override
public void logError(String message) {
getConnection();
System.out.println("Log Message : " + "ERROR");
closeConnection();
}
@Override
public void logFatal(String message) {
getConnection();
System.out.println("Log Message : " + "FATAL");
closeConnection();
}
@Override
public void getConnection() {
System.out.println("Open Database connection");
}
@Override
public void closeConnection() {
System.out.println("Close Database connection");
}
}
interface Logging {
String ORACLE = "Oracle_Database";
String MYSQL = "MySql_Database";
void logInfo(String message);
void logWarn(String message);
void logError(String message);
void logFatal(String message);
void getConnection();
void closeConnection();
}
Çıktı
Aşağıdaki çıktıyı göreceksiniz.
Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection
Yukarıdaki örnekte, her günlük yönteminin kendi uygulaması vardır. Java 8 ile arayüzler aşağıdaki değişkenlere / yöntemlere sahip olabilir.
- Sabit değişkenler
- Soyut yöntemler
- Varsayılan yöntemler
- Statik yöntemler
Java 8 kullanarak arayüzün kendisinde varsayılan uygulama ve statik yöntemlere sahip olalım.
public class Tester {
public static void main(String []args) {
LogOracle log = new LogOracle();
log.logInfo("");
log.logWarn("");
log.logError("");
log.logFatal("");
LogMySql log1 = new LogMySql();
log1.logInfo("");
log1.logWarn("");
log1.logError("");
log1.logFatal("");
}
}
final class LogOracle implements Logging {
}
final class LogMySql implements Logging {
}
interface Logging {
String ORACLE = "Oracle_Database";
String MYSQL = "MySql_Database";
default void logInfo(String message) {
getConnection();
System.out.println("Log Message : " + "INFO");
closeConnection();
}
default void logWarn(String message) {
getConnection();
System.out.println("Log Message : " + "WARN");
closeConnection();
}
default void logError(String message) {
getConnection();
System.out.println("Log Message : " + "ERROR");
closeConnection();
}
default void logFatal(String message) {
getConnection();
System.out.println("Log Message : " + "FATAL");
closeConnection();
}
static void getConnection() {
System.out.println("Open Database connection");
}
static void closeConnection() {
System.out.println("Close Database connection");
}
}
Çıktı
Aşağıdaki çıktıyı göreceksiniz.
Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection
Yukarıdaki örnekte tekrar tekrar yaşıyoruz. Java 9 ile arayüzler aşağıdaki değişkenlere / yöntemlere sahip olabilir.
- Sabit değişkenler
- Soyut yöntemler
- Varsayılan yöntemler
- Statik yöntemler
- Özel yöntemler
- Özel Statik yöntemler
Özel yöntemlere sahip olalım ve bunları Java 9'da kullanalım.
public class Tester {
public static void main(String []args) {
LogOracle log = new LogOracle();
log.logInfo("");
log.logWarn("");
log.logError("");
log.logFatal("");
LogMySql log1 = new LogMySql();
log1.logInfo("");
log1.logWarn("");
log1.logError("");
log1.logFatal("");
}
}
final class LogOracle implements Logging {
}
final class LogMySql implements Logging {
}
interface Logging {
String ORACLE = "Oracle_Database";
String MYSQL = "MySql_Database";
private void log(String message, String prefix) {
getConnection();
System.out.println("Log Message : " + prefix);
closeConnection();
}
default void logInfo(String message) {
log(message, "INFO");
}
default void logWarn(String message) {
log(message, "WARN");
}
default void logError(String message) {
log(message, "ERROR");
}
default void logFatal(String message) {
log(message, "FATAL");
}
private static void getConnection() {
System.out.println("Open Database connection");
}
private static void closeConnection() {
System.out.println("Close Database connection");
}
}
Çıktı
Aşağıdaki çıktıyı göreceksiniz.
Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection
İşletim sistemi süreçlerini kontrol etmekten ve yönetmekten sorumlu olan Java 9 Process API'de önemli ölçüde iyileştirilmiştir. ProcessHandle Sınıfı artık işlemin yerel işlem kimliğini, başlangıç saatini, birikmiş CPU süresini, bağımsız değişkenlerini, komutu, kullanıcıyı, üst süreci ve alt öğelerini sağlar. ProcessHandle sınıfı ayrıca süreçlerin canlılığını kontrol etmek ve süreçleri yok etmek için yöntem sağlar. OnExit yöntemine sahiptir, CompletableFuture sınıfı işlem çıkarken eşzamansız olarak eylem gerçekleştirebilir.
Tester.java
import java.time.ZoneId;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import java.io.IOException;
public class Tester {
public static void main(String[] args) throws IOException {
ProcessBuilder pb = new ProcessBuilder("notepad.exe");
String np = "Not Present";
Process p = pb.start();
ProcessHandle.Info info = p.info();
System.out.printf("Process ID : %s%n", p.pid());
System.out.printf("Command name : %s%n", info.command().orElse(np));
System.out.printf("Command line : %s%n", info.commandLine().orElse(np));
System.out.printf("Start time: %s%n",
info.startInstant().map(i -> i.atZone(ZoneId.systemDefault())
.toLocalDateTime().toString()).orElse(np));
System.out.printf("Arguments : %s%n",
info.arguments().map(a -> Stream.of(a).collect(
Collectors.joining(" "))).orElse(np));
System.out.printf("User : %s%n", info.user().orElse(np));
}
}
Çıktı
Aşağıdaki çıktıyı göreceksiniz.
Process ID : 5800
Command name : C:\Windows\System32\notepad.exe
Command line : Not Present
Start time: 2017-11-04T21:35:03.626
Arguments : Not Present
User: administrator
Geliştiricilerin bir dizi nesneden toplu işlemler gerçekleştirmesine yardımcı olmak için Java'da akışlar tanıtıldı. Java 9 ile, akışları daha iyi hale getirmek için birkaç yöntem daha eklenir.
takeWhile (Predicate Interface)
Sözdizimi
default Stream<T> takeWhile(Predicate<? super T> predicate)
takeWhile yöntemi, yüklem yanlış döndürene kadar tüm değerleri alır. Sıralı akış durumunda, verilen yüklemle eşleşen bu akıştan alınan öğelerin en uzun önekinden oluşan bir akış döndürür.
Misal
import java.util.stream.Stream;
public class Tester {
public static void main(String[] args) {
Stream.of("a","b","c","","e","f").takeWhile(s->!s.isEmpty())
.forEach(System.out::print);
}
}
Çıktı
takeWhame yöntemi tüm a, b ve c değerlerini alırken, dize boş olduğunda çalıştırmayı durdurur.
abc
dropWhile (Predicate Interface)
Sözdizimi
default Stream<T> dropWhile(Predicate<? super T> predicate)
dropWhile yöntemi, yüklem true dönene kadar başlangıçtaki tüm değerleri atar. Sıralı akış durumunda, verilen yüklemle eşleşen öğelerin en uzun önekini bıraktıktan sonra bu akışın kalan öğelerinden oluşan bir akış döndürür.
Misal
import java.util.stream.Stream;
public class Tester {
public static void main(String[] args) {
Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty())
.forEach(System.out::print);
System.out.println();
Stream.of("a","b","c","","e","","f").dropWhile(s-> !s.isEmpty())
.forEach(System.out::print);
}
}
Çıktı
dropWhame yöntemi a, b ve c değerlerini düşürürken, dize boş olduğunda tüm değerleri alır.
ef
ef
yinelemek
Sözdizimi
static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)
iterate yöntemi artık hasNext yüklemine sahip bir parametre olarak hasNext koşulu false döndürdüğünde döngüyü durdurur.
Misal
import java.util.stream.IntStream;
public class Tester {
public static void main(String[] args) {
IntStream.iterate(3, x -> x < 10, x -> x+ 3).forEach(System.out::println);
}
}
Çıktı
3
6
9
ofNullable
Sözdizimi
static <T> Stream<T> ofNullable(T t)
NullPointerExceptions'ı önlemek ve akışlar için null denetimlerden kaçınmak için ofNullable yöntemi tanıtıldı. Bu yöntem, boş değilse tek öğe içeren sıralı bir Akış döndürür, aksi takdirde boş bir Akış döndürür.
Misal
import java.util.stream.Stream;
public class Tester {
public static void main(String[] args) {
long count = Stream.ofNullable(100).count();
System.out.println(count);
count = Stream.ofNullable(null).count();
System.out.println(count);
}
}
Çıktı
1
0
Kaynakla dene ifadesi, bir veya daha fazla kaynağın usulüne uygun olarak bildirildiği bir deneme ifadesidir. Burada kaynak, artık gerekmediğinde kapatılması gereken bir nesnedir. Kaynakları ile dene ifadesi, gereksinim tamamlandıktan sonra her kaynağın kapatılmasını sağlar. Java.lang.AutoCloseable veya java.io.Closeable arabirimini uygulayan herhangi bir nesne, bir kaynak olarak kullanılabilir.
Java 9'dan önce, kaynaklar aşağıda verilen örnekte gösterildiği gibi try ifadesinden önce ya da try ifadesinden önce bildirilmelidir. Bu örnekte, bir dizeyi okumak için BufferedReader'ı kaynak olarak kullanacağız ve ardından BufferedReader kapatılacak.
Tester.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
public class Tester {
public static void main(String[] args) throws IOException {
System.out.println(readData("test"));
}
static String readData(String message) throws IOException {
Reader inputString = new StringReader(message);
BufferedReader br = new BufferedReader(inputString);
try (BufferedReader br1 = br) {
return br1.readLine();
}
}
}
Çıktı
test
Burada try ifadesiyle br1 kaynağını tanımlamalı ve sonra onu kullanmalıyız. Java9'da artık br1 bildirmemize gerek yok ve aşağıdaki program aynı sonucu verecektir.
Tester.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
public class Tester {
public static void main(String[] args) throws IOException {
System.out.println(readData("test"));
}
static String readData(String message) throws IOException {
Reader inputString = new StringReader(message);
BufferedReader br = new BufferedReader(inputString);
try (br) {
return br.readLine();
}
}
}
Çıktı
test
@Deprecated ek açıklama java 5 sürümünde tanıtıldı. @Deprecated ile açıklama eklenen bir program öğesi, aşağıdaki nedenlerden herhangi biri için kullanılmaması gerektiği anlamına gelir -
- Kullanımı hatalara neden olabilir.
- Gelecekteki sürümle uyumsuz olabilir.
- Gelecek sürümde kaldırılabilir.
- Daha iyi ve verimli bir alternatif, onun yerini aldı.
Derleyici, kullanımdan kaldırılmış bir öğe kullanıldığında uyarılar oluşturur. Java 9 ile @Deprecated annotation için iki yeni geliştirme yapıldı.
forRemoval- Ek açıklamalı öğenin gelecekteki bir sürümde kaldırılıp kaldırılmayacağını belirtir. Varsayılan değer yanlıştır.
since- Ek açıklamalı öğenin kullanımdan kaldırıldığı sürümü döndürür. Varsayılan değer boş dizedir.
Tarihinden beri ile kullanımdan kaldırıldı
Java 9'da aşağıdaki Boolean sınıfı javadoc örneği, @Deprecated açıklamada beri özniteliğinin kullanımını göstermektedir.
Boolean Sınıfı
ForRemoval ile kullanımdan kaldırıldı
Java 9'daki Sistem sınıfı javadoc'un aşağıdaki örneği, @Deprecated ek açıklamada forRemoval özniteliğinin kullanımını göstermektedir.
Sistem Sınıfı
Diamond operatörü, kodu daha okunaklı hale getirmek için java 7'de tanıtıldı, ancak Anonim iç sınıflarla kullanılamadı. Java 9'da, kodu basitleştirmek ve okunabilirliği artırmak için anonim sınıfla da kullanılabilir. Java 9'dan önceki aşağıdaki kodu düşünün.
Tester.java
public class Tester {
public static void main(String[] args) {
Handler<Integer> intHandler = new Handler<Integer>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler.handle();
Handler<? extends Number> intHandler1 = new Handler<Number>(2) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler1.handle();
Handler<?> handler = new Handler<Object>("test") {
@Override
public void handle() {
System.out.println(content);
}
};
handler.handle();
}
}
abstract class Handler<T> {
public T content;
public Handler(T content) {
this.content = content;
}
abstract void handle();
}
Çıktı
1
2
Test
Java 9 ile, aşağıda gösterildiği gibi anonim sınıfla <> operatörünü kullanabiliriz.
Tester.java
public class Tester {
public static void main(String[] args) {
Handler<Integer> intHandler = new Handler<>(1) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler.handle();
Handler<? extends Number> intHandler1 = new Handler<>(2) {
@Override
public void handle() {
System.out.println(content);
}
};
intHandler1.handle();
Handler<?> handler = new Handler<>("test") {
@Override
public void handle() {
System.out.println(content);
}
};
handler.handle();
}
}
abstract class Handler<T> {
public T content;
public Handler(T content) {
this.content = content;
}
abstract void handle();
}
Çıktı
1
2
Test
Boş kontrolleri ve NullPointerException sorunlarını önlemek için Java 8'de isteğe bağlı Sınıf tanıtıldı. Java 9'da, işlevselliğini artırmak için üç yeni yöntem eklenmiştir.
- stream()
- ifPresentOrElse()
- or()
stream () yöntemi
Sözdizimi
public Stream<T> stream()
Bir değer varsa, yalnızca bu değeri içeren sıralı bir Akış döndürür, aksi takdirde boş bir Akış döndürür.
Misal
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Tester {
public static void main(String[] args) {
List<Optional<String>> list = Arrays.asList (
Optional.empty(),
Optional.of("A"),
Optional.empty(),
Optional.of("B"));
//filter the list based to print non-empty values
//if optional is non-empty, get the value in stream, otherwise return empty
List<String> filteredList = list.stream()
.flatMap(o -> o.isPresent() ? Stream.of(o.get()) : Stream.empty())
.collect(Collectors.toList());
//Optional::stream method will return a stream of either one
//or zero element if data is present or not.
List<String> filteredListJava9 = list.stream()
.flatMap(Optional::stream)
.collect(Collectors.toList());
System.out.println(filteredList);
System.out.println(filteredListJava9);
}
}
Çıktı
[A, B]
[A, B]
ifPresentOrElse () yöntemi
Sözdizimi
public void ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
Bir değer varsa, verilen eylemi değerle gerçekleştirir, aksi takdirde verilen boş tabanlı eylemi gerçekleştirir.
Misal
import java.util.Optional;
public class Tester {
public static void main(String[] args) {
Optional<Integer> optional = Optional.of(1);
optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() ->
System.out.println("Not Present."));
optional = Optional.empty();
optional.ifPresentOrElse( x -> System.out.println("Value: " + x),() ->
System.out.println("Not Present."));
}
}
Çıktı
Value: 1
Not Present.
veya () yöntem
Sözdizimi
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier)
Bir değer varsa, değeri açıklayan İsteğe Bağlı bir döndürür, aksi takdirde tedarik işlevi tarafından üretilen bir İsteğe Bağlı döndürür.
Misal
import java.util.Optional;
import java.util.function.Supplier;
public class Tester {
public static void main(String[] args) {
Optional<String> optional1 = Optional.of("Mahesh");
Supplier<Optional<String>> supplierString = () -> Optional.of("Not Present");
optional1 = optional1.or( supplierString);
optional1.ifPresent( x -> System.out.println("Value: " + x));
optional1 = Optional.empty();
optional1 = optional1.or( supplierString);
optional1.ifPresent( x -> System.out.println("Value: " + x));
}
}
Çıktı
Value: Mahesh
Value: Not Present
Java 9 ile, farklı çözünürlük varyantlarına sahip birden çok görüntüyü destekleyen yeni bir çok çözünürlüklü görüntü API'si tanıtıldı. Bu API, farklı çözünürlüğe sahip bir dizi görüntünün tek bir çok çözünürlüklü görüntü olarak kullanılmasına izin verir. Aşağıda, çok çözünürlüklü görüntünün ana işlemleri yer almaktadır.
Image getResolutionVariant(double destImageWidth, double destImageHeight) - Bu mantıksal görüntüyü belirtilen boyutta temsil etmek için en iyi değişken olan belirli bir görüntüyü alır.
List<Image> getResolutionVariants() - Tüm çözünürlük değişkenlerinin okunabilir bir listesini alır.
Misal
import java.io.IOException;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.awt.Image;
import java.awt.image.MultiResolutionImage;
import java.awt.image.BaseMultiResolutionImage;
import javax.imageio.ImageIO;
public class Tester {
public static void main(String[] args) throws IOException, MalformedURLException {
List<String> imgUrls = List.of("http://www.tutorialspoint.com/java9/images/logo.png",
"http://www.tutorialspoint.com/java9/images/mini_logo.png",
"http://www.tutorialspoint.com/java9/images/large_logo.png");
List<Image> images = new ArrayList<Image>();
for (String url : imgUrls) {
images.add(ImageIO.read(new URL(url)));
}
// read all images into one multiresolution image
MultiResolutionImage multiResolutionImage =
new BaseMultiResolutionImage(images.toArray(new Image[0]));
// get all variants of images
List<Image> variants = multiResolutionImage.getResolutionVariants();
System.out.println("Total number of images: " + variants.size());
for (Image img : variants) {
System.out.println(img);
}
// get a resolution-specific image variant for each indicated size
Image variant1 = multiResolutionImage.getResolutionVariant(156, 45);
System.out.printf("\nImage for destination[%d,%d]: [%d,%d]",
156, 45, variant1.getWidth(null), variant1.getHeight(null));
Image variant2 = multiResolutionImage.getResolutionVariant(311, 89);
System.out.printf("\nImage for destination[%d,%d]: [%d,%d]", 311, 89,
variant2.getWidth(null), variant2.getHeight(null));
Image variant3 = multiResolutionImage.getResolutionVariant(622, 178);
System.out.printf("\nImage for destination[%d,%d]: [%d,%d]", 622, 178,
variant3.getWidth(null), variant3.getHeight(null));
Image variant4 = multiResolutionImage.getResolutionVariant(300, 300);
System.out.printf("\nImage for destination[%d,%d]: [%d,%d]", 300, 300,
variant4.getWidth(null), variant4.getHeight(null));
}
}
Çıktı
Total number of images: 3
BufferedImage@7ce6a65d: type = 6 ColorModel: #pixelBits = 32 numComponents = 4
color space =java.awt.color.ICC_ColorSpace@548ad73b transparency = 3
has alpha = true isAlphaPre = false ByteInterleavedRaster: width =311
height = 89 #numDataElements 4 dataOff[0] = 3
BufferedImage@4c762604: type = 6 ColorModel: #pixelBits = 32 numComponents = 4
color space =java.awt.color.ICC_ColorSpace@548ad73b transparency = 3
has alpha = true isAlphaPre = false ByteInterleavedRaster: width =156
height = 45 #numDataElements 4 dataOff[0] = 3
BufferedImage@2641e737: type = 6 ColorModel: #pixelBits = 32 numComponents = 4
color space =java.awt.color.ICC_ColorSpace@548ad73b transparency = 3
has alpha = true isAlphaPre = false ByteInterleavedRaster: width =622
height = 178 #numDataElements 4 dataOff[0] = 3
Image for destination[156,45]: [311,89]
Image for destination[311,89]: [311,89]
Image for destination[622,178]: [622,178]
Image for destination[300,300]: [622,178]
CompletableFuture sınıfı, değeri ve durum açıklığı ayarlanarak tamamlanabilen Geleceği temsil etmek için Java 8'de tanıtıldı. Java.util.concurrent.CompletionStage olarak kullanılabilir. Geleceğin tamamlanmasıyla tetiklenen bağımlı işlevleri ve eylemleri destekler. Java'da 9 CompletableFuture API daha da geliştirildi. API'de yapılan ilgili değişiklikler aşağıdadır.
- Gecikmeler ve zaman aşımları için destek.
- Alt sınıflandırma için geliştirilmiş destek.
- Yeni fabrika yöntemleri eklendi.
Gecikmeler ve zaman aşımları için destek
public CompletableFuture<T> completeOnTimeout(T value, long timeout, TimeUnit unit)
Bu yöntem, bu CompletableFuture'u, verilen zaman aşımından önce başka şekilde tamamlanmadıysa, verilen değerle tamamlar.
public CompletableFuture<T> orTimeout(long timeout, TimeUnit unit)
Bu yöntem, belirtilen zaman aşımından önce aksi şekilde tamamlanmadıysa, bu CompletableFuture'u bir TimeoutException ile istisnai olarak tamamlar.
Alt sınıflandırma için geliştirilmiş destek
public Executor defaultExecutor()
Bir Executor belirtmeyen zaman uyumsuz yöntemler için kullanılan varsayılan Yürütücüyü döndürür. Bu yöntem alt sınıflarda geçersiz kılınabilir ve bir Yürütücünün minimum olarak bir bağımsız iş parçacığı sağlaması için döndürülebilir.
public <U> CompletableFuture<U> newIncompleteFuture()
CompletionStage yöntemiyle döndürülecek türde yeni bir tamamlanmamış CompletableFuture döndürür. CompletableFuture sınıfının alt sınıfları, bu CompletableFuture ile aynı sınıfın bir örneğini döndürmek için bu yöntemi geçersiz kılmalıdır. Varsayılan uygulama CompletableFuture sınıfının bir örneğini döndürür.
Yeni fabrika Yöntemleri
public static <U> CompletableFuture<U> completedFuture(U value)
Bu fabrika yöntemi, verilen değerle zaten tamamlanmış olan yeni bir CompletableFuture döndürür.
public static <U> CompletionStage<U> completedStage(U value)
Bu fabrika yöntemi, verilen değerle zaten tamamlanmış yeni bir CompletionStage döndürür ve yalnızca CompletionStage arayüzünde bulunan yöntemleri destekler.
public static <U> CompletionStage<U> failedStage(Throwable ex)
Bu fabrika yöntemi, belirtilen istisna ile istisnai olarak zaten tamamlanmış ve yalnızca CompletionStage arayüzünde bulunan yöntemleri destekleyen yeni bir CompletionStage döndürür.
Belirtilen özelliklerin yanı sıra Java 9 ile JDK platformunda çok daha fazla geliştirme yapıldı. Bunlardan bazıları aşağıda listelenmiştir.
- GC (Çöp Toplayıcı) İyileştirmeleri
- Stack-Walking API
- Gelen Serileştirme Verilerini Filtrele
- Applet API'sini kullanımdan kaldırın
- Dize Birleştirmesini Belirtin
- Gelişmiş Yöntem Tutamaçları
- Java Platform Logging API ve Hizmeti
- Kompakt Dizeler
- Nashorn için Ayrıştırıcı API