Soru Java'da Yeni Anahtar Kelimeler 9


Java 9'un en büyük özelliklerinden biri, Project Jigsaw tarafından tanımlanan bir modül sistemi olacaktır. Slaytları okurken Proje Yapboz: Başlık Altında JavaOne 2015'te aşağıdaki kaynak kodunu fark ettim:

// src/java.sql/module-info.java
module java.sql {
   exports java.sql;
   exports javax.sql;
   exports javax.transaction.xa;
}

Burada ilginç olan şey, dosyanın .java ve iki yeni anahtar kelime kullanıyor görünüyor: module, ve exports. Java 9'da başka hangi anahtar kelimeler tanıtılacak? Geriye dönük uyumluluk nasıl ele alınacaktır (örn. module)?


38
2018-03-31 00:37


Menşei


Sanırım bir noktada da alacağız ref ve any. - Paul Boddington
@PaulBoddington kesinlikle Java 9'da değil herhangi Anahtar kelime. Bu Valhalla, yani. 10 ya da daha sonra. - kervin
"Geriye dönük uyumluluk nasıl ele alınacaktır", muhtemelen her zamankiyle aynı: etkilenen dosyaları daha eski bir kaynak sürümü ile derlemelisiniz - the8472


Cevaplar:


Java 9'daki modül bildirimleri için eklenen anahtar kelimeler özetlenmiştir. §3.9 Java Dil Özellikleri, Java SE 9 Baskı:

Daha fazla on karakter dizisi, kısıtlanmış anahtar kelimelerdir: open,      module, requires, transitive, exports, opens, to, uses,      provides, ve with. Bu karakter dizileri,     Anahtar kelimeler, yalnızca ModuleDeclaration'da terminal olarak göründükleri yerlerde     ve ModuleDirective yapımları (§7.7). Onlar olarak belirlendi     Yazılı programlarla uyumluluk için her yerdeki tanımlayıcılar     Java SE 9'dan önce. Bir istisna var: hemen sağa     Karakter dizisinin ModülüDirektif üretiminde gerektirir,     karakter dizisi geçişi, anahtar kelime olarak anahtar sözcük olarak değil     bir ayırıcı tarafından takip edilir, bu durumda bir     tanımlayıcı.

Şu anda adında bir yönteminiz varsa moduleveya başka herhangi biri Burada listelenen anahtar kelimeler, derlemeye devam edecektir.

(view ve permits Jigsaw prototipinde anahtar kelimeler vardı, ancak Onlar uzun zaman önce varlığını basitleştirdiler.)


62
2018-03-31 01:38



Mark Reinhold'ı burada görmek çok güzel! - Ali Dehghani
Hakkında herhangi bir bilginiz var mı view ve permitssadece tarih / belge porpsleri için mi? - paulotorrens
Geçişler listeye hiç benzemiyor mu? - Jean-François Savard
Kısıtlı anahtar kelimeler harika bir fikirdir. Daha sık kullanılmasını isterdim. - Adowrath
open ve opens da kayıp. - Mordechai


Bu muhtemelen tam bir liste değildir ve bunların hiçbiri bildiğim kadarıyla kesinleşmedi, ancak birkaç tane buldum.

Ayrıca buna sahibiz module, exports, provides, uses, with, to, ve requires; açıkladı İşte:

Modül sistemi, ServiceLoader :: load yöntemlerinin çağrılması için modül dosyalarını modül dosyalarında tarayarak hizmetlerin kullanımını belirleyebilir, ancak bu hem yavaş hem de güvenilir olamaz. Bir modülün belirli bir servisi kullanması, bu modülün tanımının temel bir yönüdür, dolayısıyla hem verimlilik hem de açıklık için, modülün bir kullanım cümlesiyle beyanında olduğunu belirtiriz:

module java.sql {
    requires public java.logging;
    requires public java.xml;
    exports java.sql;
    exports javax.sql;
    exports javax.transaction.xa;
    uses java.sql.Driver;
}

Modül sistemi, ServiceLoader sınıfı bugün yaptığı gibi, META-INF / hizmetler kaynak girişleri için modül eserlerini tarayarak servis sağlayıcıları tanımlayabilir. Bununla birlikte, bir modülün belirli bir hizmetin uygulanmasını sağlaması da aynı derecede temeldir, bu nedenle modülün bir sağlayanın yan tümcesine sahip olduğunu beyan ederiz:

module com.mysql.jdbc {
    requires java.sql;
    requires org.slf4j;
    exports com.mysql.jdbc;
    provides java.sql.Driver with com.mysql.jdbc.Driver;
}

...

module java.base {
    ...
    exports sun.reflect to
        java.corba,
        java.logging,
        java.sql,
        java.sql.rowset,
        jdk.scripting.nashorn;
}

Ayrıca view ve permits:

Büyük yazılım sistemlerinde, aynı modülün çoklu görünümlerini tanımlamak genellikle yararlıdır. Bir görünüm başka bir modül tarafından genel kullanım için beyan edilebilir, diğeri ise sadece yakın ilişkili modüllerden oluşan bir grup tarafından kullanılmak üzere tasarlanan iç arabirimlere erişim sağlar.

Örneğin, JNDI ile biz bu com.sun.jndi.toolkit.url modülünün sadece deklarasyonda belirtildiği gibi kobaling ve kerberos modülleri için görünmesini istiyoruz.

view jdk.jndi.internal {
    exports com.sun.jndi.toolkit.url.*;
    exports sun.net.dns.*;
    permits jdk.cosnaming;
    permits jdk.kerberos;

}

Bu şekilde modül sınırlarını tanımlamak için daha fazla esnekliğe sahibiz.

Ayrıca bahsettim optional.


5
2018-03-31 00:49



Sınıfı biliyorum Optional<T> ama gerçekten bir anahtar kelime yapmayı düşünüyorlar mı? Bunun üzerinde JEP var mı? - Will Sherwood
Lafı olmaz... with ve toÇok değişken isimler olarak kullanılmaktadır. Umarım anahtar kelimeler yalnızca alakalı bir şekilde kullanılır. module tanım! - Will Sherwood
İnşallah! İyi resmi kaynakları bulamıyorum, ancak Jigsaw Project belgeleri, anahtar kelimeler yerine "değiştirici" olduklarını gösteriyor gibi görünüyor. module. - Will


modülbir yeni Anahtar kelimeler paketler arasındaki bağımlılıkları tanımlamak için tanıtıldı. Neden modüllere ihtiyacımız var? Çünkü daha önce

  1. Kapsülleme tertemiz değildi. Yansıma ve benzer teknikler yardımıyla özel alana bile erişebildik.
  2. Tüm kavanozlarda tüm sınıflar halka açıktı.
  3. Eğer Classloader sınıfı almazsa, bir çok alana bakmak zorunda kaldı ve çok sayıda ilgili dosya yükledikten sonra Class bulunmazsa, o zaman NoClassDefFoundErrors'u çalışma zamanında atardı.

    Dolayısıyla, yukarıdaki tüm nedenlerden ötürü, JVM'nin bunu çalışma zamanında bilmesini sağlayan bir mekanizmaya ihtiyacımız var. Uygulama modülü için tanımlamanız gerekir module-info.java. o pakette

        module com.exporter{
    
         exports com.a;
         provides com.b.M;
          with com.b.MImpl; }
    

Başka bir pakette,

module com.consume {
    requires com.a;
}

Kullanılan diğer özellikler "ihracat" ve "gerektirir"Bağımlılık yapmak için (sadece geçiş bağımlılığı")sağlar" ve "ile"arayüzü açığa çıkarmak ve uygulamaya değinmek için. Bu yüzden güçlü bir kapsülleme olabilir, bu nedenle java 9 daha iyi Object Oriented özelliğine daha fazla eğimlidir.


-1
2017-07-19 14:23





Sorunun geriye dönük uyumluluk kısmı için.

JAVA9 / proje yapbozunun Java teknolojisinde bir paradigma değişimi olduğunu düşünüyorum. Böylece java9 geriye dönük olarak uyumlu olmayacaktır, ancak modüler olmayan bağımlılığınızı aynı kütüphanenin modüler versiyonuna kolayca dönüştürebilirsiniz. "No-Pain, No-Gain" kavramı burada çalışacaktır. Herkes yeni modüler java'dan yararlanmak için yükseltmeli / dönüştürmeli. IDE geliştiricisi, eklenti geliştiricisi, Yapım Sistemi ve elbette groud seviyesi java geliştiricisinin yeni java sistemlerini anlaması gerekir.

JAVA9, temiz bağımlılığı savunmaktadır. Ayrıca kodunuzu özel modüller ile güvenceye almanın yepyeni bir yolunu sunar. Hatta yansıma kütüphane / API sahibi tarafından maruz kalmayan modüllere erişemez.

Modüler olmayan LIB / API'leri kullanmanın iki yaklaşımı vardır.

  1. Yukarıdan aşağıya yaklaşma
  2. Aşağıdan yukarıya yaklaşım (uygulamak için çok fazla acı)

İkinci yaklaşım çok temiz bir modül bağımlılık hiyerarşisi yapar.


-4
2018-05-13 12:50



“Böylece java9 geriye dönük uyumlu olmayacaktır…” Yanlış. Programınız modül tanımlamazsa, aynen Java 8'de olduğu gibi çalışır. - VGR
Dahili api'ye erişmediğiniz veya bir modüldeki herhangi bir şey üzerinde yansıma kullanmaya çalışmadığınız sürece programınız aynı şekilde çalışır. - killjoy