SORU
23 EKİM 2009, Cuma


Java değiştirme son alanları

Hadi basit bir test çalışması ile başlar:

import java.lang.reflect.Field;

public class Test {
  private final int primitiveInt = 42;
  private final Integer wrappedInt = 42;
  private final String stringValue = "42";

  public int getPrimitiveInt()   { return this.primitiveInt; }
  public int getWrappedInt()     { return this.wrappedInt; }
  public String getStringValue() { return this.stringValue; }

  public void changeField(String name, Object value) throws IllegalAccessException, NoSuchFieldException {
    Field field = Test.class.getDeclaredField(name);
    field.setAccessible(true);
    field.set(this, value);
    System.out.println("reflection: "   name   " = "   field.get(this));
  }

  public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {
    Test test = new Test();

    test.changeField("primitiveInt", 84);
    System.out.println("direct: primitiveInt = "   test.getPrimitiveInt());

    test.changeField("wrappedInt", 84);
    System.out.println("direct: wrappedInt = "   test.getWrappedInt());

    test.changeField("stringValue", "84");
    System.out.println("direct: stringValue = "   test.getStringValue());
  }
}

Herkes çıktı (sürpriz hemen değil bozmak gibi alt kısmında gösterilen) olarak basılmış ne olacağını tahmin etmek ister.

Sorular:

  1. Neden ilkel ve sarılmış tamsayı farklı davranır mı?
  2. Neden yansıtıcı vs doğrudan erişim farklı sonuçlar verir mi?
  3. Beni en çok veba - neden String gibi ilkel int uslu ve Integer gibi değil mi?

Sonuçlar (java 1.5):

reflection: primitiveInt = 84
direct: primitiveInt = 42
reflection: wrappedInt = 84
direct: wrappedInt = 84
reflection: stringValue = 84
direct: stringValue = 42

CEVAP
23 EKİM 2009, Cuma


Derleme zamanı sabitleri inlined-derleme zamanında javac (). Bu İDEA bakın, özellikle 15.28'de sabit tanımlar ifade ve 13.4.9 anlatılır ikili uyumluluk ya son alanlar ve sabitler.

Eğer alan-son sigara ya da olmayan bir derleme zamanı sabiti atama yaparsanız, değer değil inlined. Örneğin:

özel final String = null!=çağrısı"": null? ""; . 42

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • andyabc45

    andyabc45

    1 Mayıs 2011
  • Brendan van Son

    Brendan van

    5 Aralık 2006
  • LavcoPriceTech

    LavcoPriceTe

    21 AĞUSTOS 2010