SORU
27 Temmuz 2010, Salı


Java yöntemleri varsayılan olarak statik olmalıdır?

A sınıfı foo foo() Hiç Bir devlet, herhangi bir erişim yok yöntemi yazdığını söyle. Sen foo mu ne, ya da nasıl davrandığını hakkında başka bir şey biliyor. Bir çok işe yarar.

Foo hep statik, başka hususlar bağımsız olmalıdır? Neden olmasın?

Derslerim hep görevleri bozuyorum ve sadece bir kez yazma-ilkesini uygulamak çok özel yardımcı yöntemler birikimi, gibi görünüyor. Bunların çoğu nesnenin durumu güvenmeyin, ama asla sınıfın kendi yöntemleri dışında yararlı olacaktır. Varsayılan olarak statik olmalıdır? Yanlış iç statik yöntemleri büyük bir sayı ile sonuna kadar.

CEVAP
28 Temmuz 2010, ÇARŞAMBA


Başlık, genel olarak, bu soruyu cevaplamak için, Java yöntemlerideğilvarsayılan olarak statik olarak. Java nesne yönelimli bir dildir.

Sen ancak biraz farklı. Özellikle yardımcı yöntemler bahsediyorsun.

Durumundayardımcı yöntemlerBu parametre olarak bir değer alır ve bir değer, devlet erişmeden, geri döndülerstatik olmalıdır. Özel ve statik. Ben vurgulayalım:

Devletin erişemediği yardımcı yöntemler statik olmalıdır.


1. En büyük avantajı: kodudur daha anlamlı.

Bu yöntemler en azından büyük bir avantaja sahip statik yapım: bunu yapmaktamamen açıkkod bubu yöntem, herhangi bir örnek durumu bilmesine hiç gerek yok.

Kod kendisi için konuşur. Şeyler gelecekte bir noktada kodunuzu, senin için bile okuyacak diğer insanlar için daha belirgin hale gelir.

2. Başka bir avantaj: kodu ile ilgili basit bir sebep olabilir.

Eğer bu yöntem harici veya genel durumuna bağlı değildir emin ol, o zamansaf bir işlevyani, bir fonksiyonmatematiksel anlamdaaynı girdi için her zaman aynı çıktıyı elde etmek için emin olabilirsiniz.

3. Optimizasyon avantajları

Bu yöntem statik ve saf bir fonksiyonu ise, o zaman bazı durumlarda olabilirmemoizedbiraz performans artışı elde (daha fazla bellek kullanarak değiştirin.

4. Bayt düzeyinde farklılıklar

Eğer statik bir yöntem olarak örnek bir yöntem olarak ya da yardımcı yöntem bildirirseniz bayt düzeyinde, tamamen farklı iki şey elde edersiniz.

Bu bölüm, anlamak daha kolay hale getirmek için, hadi bir örnek:

public class App {
    public static void main(String[] args) {
        WithoutStaticMethods without = new WithoutStaticMethods();
        without.setValue(1);
        without.calculate();

        WithStaticMethods with = new WithStaticMethods();
        with.setValue(1);
        with.calculate();
    }
}

class WithoutStaticMethods {

    private int value;

    private int helper(int a, int b) {
        return a * b   1;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int calculate() {
        return helper(value, 2 * value);
    }
}

class WithStaticMethods {

    private int value;

    private static int helper(int a, int b) {
        return a * b   1;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public int calculate() {
        return helper(value, 2 * value);
    }
}

İlgilendiğiniz hatları sınıflar helper(...) çağrıları WithoutStaticMethods WithStaticMethods.

Statik yöntemler olmadan

Yardımcı yöntemini çağırdığınızda statik yöntemler, olmadan ilk durumda, JVM örnek başvuru invokespecial geçmek için zorlamak gerekir. calculate() yöntem: bu kodu bir göz atın

 0 aload_0
 1 aload_0
 2 getfield #2 <app/WithoutStaticMethods.value>
 5 iconst_2
 6 aload_0
 7 getfield #2 <app/WithoutStaticMethods.value>
10 imul
11 invokespecial #3 <app/WithoutStaticMethods.helper>
14 ireturn

0 (veya 1) Bu yönerge, aload_0, yığın örnek başvuru yük olacak, ve daha sonra invokespecial tarafından tüketilen olacak. Bu yönerge helper(...) işlevin ilk parametre olarak bu değeri koyacağız, ve asla görebileceğimiz şekilde kullanılır:

0 iload_1
1 iload_2
2 imul
3 iconst_1
4 iadd
5 ireturn

iload_0 hayır, gördün mü? Gereksiz yere yüklenmiş.

Statik yöntemler ile

Eğer yardımcı yöntem, statik bildirirseniz, calculate() yöntemi gibi görünecektir:

 0 aload_0
 1 getfield #2 <app/WithStaticMethods.value>
 4 iconst_2
 5 aload_0
 6 getfield #2 <app/WithStaticMethods.value>
 9 imul
10 invokestatic #3 <app/WithStaticMethods.helper>
13 ireturn

Farklılıklar:

  • az aload_0 talimat bir tane var
  • yardımcı yöntem şimdi invokestatic denir

Peki, kod yardımcı işlevi de biraz farklı: yok this birinci parametre olarak, yani parametreler aslında pozisyonları 0 ve 1 olarak görebiliriz burada:

0 iload_0
1 iload_1
2 imul
3 iconst_1
4 iadd
5 ireturn

Sonuç

Kod kendisi için konuşur, daha yararlı bilgiler içerir. kod tasarımı bu açıdan çok daha mantıklı yardımcı yöntem statik beyan ediyor: Örnek çalışma için devlet gerekli değildir devletler.

At bayt kodu seviye daha temiz oluyor ve orada hiçbir işe yaramaz kod (bu, ancak ben inanıyorum JİT imkan optimize, olmaz tabi bir önemli performans maliyet).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Hallucination Land

    Hallucinatio

    14 Ocak 2011
  • KRQE

    KRQE

    6 AĞUSTOS 2007
  • stokelycalm

    stokelycalm

    28 Aralık 2010