Java'da satır içi işlevler kavramı var mı, yoksa yerini başka bir şey mi alıyor? Varsa nasıl kullanılır? Ben duydum public
, static
ve final
yöntemler satır içi fonksiyonlardır. Kendi satır içi işlevimizi oluşturabilir miyiz?
Java'da satır içi işlevler kavramı var mı, yoksa yerini başka bir şey mi alıyor? Varsa nasıl kullanılır? Ben duydum public
, static
ve final
yöntemler satır içi fonksiyonlardır. Kendi satır içi işlevimizi oluşturabilir miyiz?
Yanıtlar:
Java'da optimizasyonlar genellikle JVM seviyesinde yapılır. Çalışma zamanında JVM, hangi yöntemlerin satır içi yapılacağını belirlemek için bazı "karmaşık" analizler gerçekleştirir. Satır içi olarak agresif olabilir ve Hotspot JVM aslında nihai olmayan yöntemleri satır içi yapabilir.
Java derleyicileri neredeyse hiçbir zaman herhangi bir yöntem çağrısını satır içi olarak gerçekleştirmez (JVM bunların hepsini çalışma zamanında yapar). Zaman sabitlerini satır içi derlerler (örneğin, son statik ilkel değerler). Ama yöntemler değil.
Daha fazla kaynak için:
Makale: Java HotSpot Performans Motoru: Yöntem Satır İçi Örnek
Wiki: OpenJDK'da satır içi , tam olarak doldurulmamış, ancak yararlı tartışmalara bağlantılar içerir.
Hayır, javada satır içi işlev yoktur . Evet, genel bir sınıfa yerleştirildiğinde kodun herhangi bir yerinde genel bir statik yöntem kullanabilirsiniz. Java derleyicisi, statik veya son bir yöntem üzerinde satır içi genişletme yapabilir , ancak bu garanti edilmez.
Tipik olarak bu tür kod optimizasyonları, çok sık kullanılan kod segmentleri için JVM / JIT / HotSpot ile birlikte derleyici tarafından yapılır. Ayrıca, parametrelerin kayıt bildirimi gibi diğer optimizasyon kavramları java'da bilinmemektedir.
Optimizasyonlar java'da bildirimle zorlanamaz, ancak derleyici ve JIT tarafından yapılır. Diğer birçok dilde, bu bildirimler genellikle yalnızca derleyici ipuçlarıdır (işlemcinin sahip olduğundan daha fazla yazmaç parametresi bildirebilirsiniz, geri kalanı yok sayılır).
Java yöntemlerinin statik, son veya özel olarak bildirilmesi de derleyici için ipuçlarıdır. Kullanmalısın, ama garanti yok. Java performansı dinamiktir, statik değil. Bir sisteme ilk çağrı, sınıf yüklemesi nedeniyle her zaman yavaştır. Sonraki çağrılar daha hızlıdır, ancak belleğe ve çalışma süresine bağlı olarak en yaygın çağrılar çalışan sistem içinde optimize edilir, bu nedenle bir sunucu çalışma süresi sırasında daha hızlı hale gelebilir!
final
JIT satır içi üzerinde hiçbir etki yapmayın
Java, bir yöntemin satır içine alınması gerektiğini manuel olarak önermenin bir yolunu sağlamaz. @Notnoop'un yorumlarda dediği gibi, satır içi genellikle yürütme sırasında JVM tarafından yapılır.
jdk.internal.vm.annotation.ForceInline
Yukarıda söylediğiniz doğru. Bazen son yöntemler satır içi olarak oluşturulur, ancak java'da açıkça bir satır içi işlev oluşturmanın başka bir yolu yoktur.
final
, yöntemin satır içi olup olmadığı konusunda herhangi bir fark yaratmaz.
Gerçek hayat örneği:
public class Control {
public static final long EXPIRED_ON = 1386082988202l;
public static final boolean isExpired() {
return (System.currentTimeMillis() > EXPIRED_ON);
}
}
Sonra diğer sınıflarda, kodun süresi dolmuşsa çıkabilirim. EXPIRED_ON değişkenine başka bir sınıftan atıfta bulunursam, sabit bayt koduyla aynı hizadadır ve bu da koddaki son kullanma tarihini kontrol eden tüm yerleri bulmayı çok zorlaştırır. Ancak, diğer sınıflar isExpired () yöntemini çağırırsa, gerçek yöntem çağrılır, yani bir bilgisayar korsanı isExpired yöntemini her zaman false döndüren başka bir yöntemle değiştirebilir.
Bir derleyiciyi statik son yöntemi kendisine başvuran tüm sınıflara satır içi yapmaya zorlamanın çok güzel olacağını kabul ediyorum. Bu durumda, çalışma zamanında gerekli olmayacağı için Control sınıfını dahil etmeniz bile gerekmez.
Araştırmamdan bu yapılamaz. Belki bazı Obfuscator araçları bunu yapabilir veya derlemeden önce kaynakları düzenlemek için derleme sürecinizi değiştirebilirsiniz.
Derleme sırasında kontrol sınıfındaki yöntemin başka bir sınıfa satır içi olarak yerleştirilip yerleştirilmediğini kanıtlamaya gelince, diğer sınıfı sınıf yolunda Control sınıfı olmadan çalıştırmayı deneyin.
Pekala, javada "satır içi" olarak adlandırılabilecek yöntemler vardır, ancak jvm'ye bağlıdır. Derlemeden sonra, yöntemin makine kodu 35 bayttan az ise, hemen bir satır içi yönteme aktarılacaktır, yöntemin makine kodu 325 bayttan küçükse, jvm'ye bağlı olarak bir satır içi yönteme aktarılabilir.
yani, yok gibi görünüyor, ancak bu geçici çözümü guava veya eşdeğer bir Function sınıfı uygulaması kullanarak kullanabilirsiniz, çünkü bu sınıf son derece basittir, örn .:
assert false : new com.google.common.base.Function<Void,String>(){
@Override public String apply(Void input) {
//your complex code go here
return "weird message";
}}.apply(null);
evet, bu sadece karmaşık bir kod bloğunun nasıl oluşturulacağını ({} içinde), bunun için herhangi bir yöntem oluşturmada bizi rahatsız etmemesi gereken çok özel bir şeyi nasıl yapacağımızı örneklemek için ölü koddur, AKA inline!