Java: int'i referans olarak geçirmenin en iyi yolu


84

Bir bayt arabelleğinden kodlanmış bir uzunluğu ayrıştıran, ayrıştırılmış uzunluğu bir int olarak döndüren ve bir tamsayı arg olarak arabelleğe bir dizin alan bir ayrıştırma işlevim var. Fonksiyonun indeksi ayrıştırılana göre güncellemesini istiyorum, yani bu indeksi referansla geçirmek istiyorum. C'de sadece bir int *. Bunu Java'da yapmanın en temiz yolu nedir? Şu anda arg indisini geçmeye bakıyorum. olarak int[], ama biraz çirkin.


13
Integerdeğişmezdir.
Yuval Adam

1
Apache kitaplığından kaçınmak istiyorsanız, int'i iletebilir ve güncellenmiş değeri döndürebilirsiniz. İki değer ise, Point'i konteyner olarak kullanmanızı öneririm. Aksi takdirde, dizi seçeneği veya buradaki diğer önerilerden biri uygundur.
EntangledLoops

Bir int veya bir nesneyi döndürmelisiniz; Gerçekten birden fazlasına ihtiyacınız varsa, belki de 'sınıflar' tasarımınızı yeniden düşünmelisiniz
Ujjwal Singh

Yanıtlar:


72

org.apache.commons.lang.mutable.MutableIntApache Commons kitaplığından kullanmayı deneyebilirsiniz . Bunu dilin kendisinde yapmanın doğrudan bir yolu yoktur.


24

Java'da bu mümkün değildir. Önerdiğiniz gibi, bir yol bir int[]. Bir diğeri, küçük bir sınıfa IntHoldersahip olmaktır, örneğin bir int.


20

Java'da bağımsız değişkenleri başvuruya göre iletemezsiniz.

Yapabileceğiniz şey, tamsayı değerinizi değiştirilebilir bir nesneye kaydırmaktır. Apache Commons'ı kullanmak MutableIntiyi bir seçenektir. Başka, biraz daha karmaşık bir yol, int[]önerdiğiniz gibi kullanmaktır . intTek hücreli bir diziyi neden sarmaladığınız net olmadığından bunu kullanmam .

Bunun java.lang.Integerdeğişmez olduğunu unutmayın .


AtomicInteger kullanımına ne dersiniz? Bu değişebilir mi ve referans yoluyla iletilir mi? (Afaik AtomicReference <Boolean> bunu doğru bir şekilde yapar).
icbytes


14

Bayt arabelleğini ve dizini bir ByteBuffer nesnesine sarın . Bir ByteBuffer, bir tampon + konumu kavramını kapsüller ve siz ilerledikçe güncellediği indekslenmiş konumdan okumanıza ve yazmanıza olanak tanır.


6
Kesinlikle. Java'yı kendi yönteminizle yapmaya zorlamayın, Java yöntemiyle yapın. Java C değildir. C gibi davranma girişimleri her zaman çirkin hackler olacaktır.
Atla

9

Şu şekilde yeni bir sınıf tasarlayabilirsiniz:

public class Inte{
       public int x=0;
}

daha sonra bu sınıfın nesnesini oluşturabilirsiniz:

Inte inte=new Inte();

daha sonra intebir tamsayı değişkenini geçirmek istediğiniz yere bağımsız değişken olarak geçebilirsiniz:

public void function(Inte inte) {
some code
}

yani tamsayı değerini güncellemek için:

inte.x=value;

değer elde etmek için:

Variable=inte.x;

8

İlkelleri sarmak için bir Referans sınıfı oluşturabilirsiniz:

public class Ref<T>
{
    public T Value;

    public Ref(T value)
    {
        Value = value;
    }
}

Ardından parametre olarak Referans alan işlevler oluşturabilirsiniz:

public class Utils
{
    public static <T> void Swap(Ref<T> t1, Ref<T> t2)
    {
        T temp = t1.Value;
        t1.Value = t2.Value;
        t2.Value = temp;
    }
}

Kullanım:

Ref<Integer> x = 2;
Ref<Integer> y = 9;
Utils.Swap(x, y);

System.out.println("x is now equal to " + x.Value + " and y is now equal to " + y.Value";
// Will print: x is now equal to 9 and y is now equal to 2

Bu yardımcı olur umarım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.