SORU
21 HAZİRAN 2012, PERŞEMBE


Değiştirilebilir bir java oluşturun.lang.String

Java Stringler değişmez olduğu biliniyor. Değişmez Dizeler kuruluşundan bu yana java için harika bir yanı vardır. Değişmezliğini tanıdı hızlı erişim ve iyileştirmeler bir sürü sağlar önemli ölçüde daha az hata eğilimli C-stil göre dizeler ve güvenlik modeli uygulamak yardımcı olur.

Olası kesmek kullanmadan değiştirilebilir bir tane oluşturmak için, yani

  • java.lang.refect
  • sun.misc.Unsafe
  • Bootstrap classloader sınıflar
  • JNI (veya JNI gerektirir JNA)

Ama mümkünse sadece düz Java, dize herhangi bir zamanda değiştirilebilir? SoruNasıl?

CEVAP
21 HAZİRAN 2012, PERŞEMBE


java.lang.String Karakter seti ile bir yapıcı oluşturma, CharsetDecoder kendi getiriyor kendi Karakter kümesi, enjekte edebilir. CharsetDecoder decodeLoop yöntemi CharBuffer bir nesne için bir başvuru alır. Bu CharBuffer char sarar[] orijinal String nesnesi. Bu CharsetDecoder bir başvuru olduğundan, altta yatan char değiştirebilirsiniz[] CharBuffer kullanarak, böylece değişken bir Dize var.

public class MutableStringTest {


    // http://stackoverflow.com/questions/11146255/how-to-create-mutable-java-lang-string#11146288
    @Test
    public void testMutableString() throws Exception {
        final String s = createModifiableString();
        System.out.println(s);
        modify(s);
        System.out.println(s);
    }

    private final AtomicReference<CharBuffer> cbRef = new AtomicReference<CharBuffer>();
    private String createModifiableString() {
        Charset charset = new Charset("foo", null) {
            @Override
            public boolean contains(Charset cs) {
                return false;
            }

            @Override
            public CharsetDecoder newDecoder() {
                CharsetDecoder cd = new CharsetDecoder(this, 1.0f, 1.0f) {
                    @Override
                    protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) {
                        cbRef.set(out);
                        while(in.remaining()>0) {
                            out.append((char)in.get());
                        }
                        return CoderResult.UNDERFLOW;
                    }
                };
                return cd;
            }

            @Override
            public CharsetEncoder newEncoder() {
                return null;
            }
        };
        return new String("abc".getBytes(), charset);
    }
    private void modify(String s) {
        CharBuffer charBuffer = cbRef.get();
        charBuffer.position(0);
        charBuffer.put("xyz");
    }

}

Kod çalışan yazdırır

abc
zzz

Doğru decodeLoop uygulamak için nasıl bilmiyorum () ama şu an umrunda :) bilmiyorum

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Djbasilio AuToBaSs

    Djbasilio Au

    20 Aralık 2008
  • Edge-CGI 3D Tutorials and more!

    Edge-CGI 3D

    11 HAZİRAN 2013
  • kalabrandmusic

    kalabrandmus

    25 Kasım 2009