Void nesnesini döndürmek


113

Voidİlkel olmayan bir türü döndürmenin doğru yolu nedir ? Örneğin. Şu anda aşağıdaki gibi null kullanıyorum.

interface B<E>{ E method(); }

class A implements B<Void>{

    public Void method(){
        // do something
        return null;
    }
}

1
Yorumlayıcı kalıbını kullanarak bir dosya formatı için bir yorumlayıcı yazıyorum, ancak bazı ifadelerin dönüş değerleri yok
Robert

2
Void türünü somutlaştırmanın bir yolu yoktur, bu yüzden gerçekten bu türden bir şey döndürmeniz gerekiyorsa, tek seçeneğiniz null'dur. Ancak, muhtemelen herhangi bir şey için döndürülen değere ihtiyacınız yoktur, bu nedenle null iyi olmalıdır.
Jorn

evet, benim mantığım da buydu
Robert

1
Tıpkı sizin örneğiniz gibi kodlardım. Bu güzel bir yaklaşım.
David Roussel

Yanıtlar:


134

Void sınıfı, Java anahtar sözcüğü void'i temsil eden Class nesnesine bir başvuruyu tutan, bir anonim olmayan yer tutucu sınıftır.

Yani aşağıdakilerden herhangi biri yeterli olacaktır:

  • ile parametrelendirme Objectve dönen new Object()veyanull
  • ile parametrelendirme Voidve geri dönmenull
  • NullObjectseninki ile parametrelendirme

Bu yöntemi yapamaz voidve başka bir şey döner bir şey . Bu bir şey göz ardı edildiğine göre, her şeyi iade edebilirsiniz.


2
o zaman bir dönüş tipi boşluğa ulaşmanın genel olarak doğru yolu nedir?
Robert

1
Null değerini geçersiz olarak döndürmek istiyorsanız, bazı durumlarda onu kullanmanız gerekir: (Void) null
Patrick Favre

return (Void)null;
Alex R

(Void) null, null'dan herhangi bir şekilde ayırt edilebilir mi?
Orangle

13

Java 8 Optional<T>, bu gibi durumlarda kullanılabilecek yeni bir sınıf getirmiştir . Kullanmak için, kodunuzu aşağıdaki gibi biraz değiştirmelisiniz:

interface B<E>{ Optional<E> method(); }

class A implements B<Void>{

    public Optional<Void> method(){
        // do something
        return Optional.empty();
    }
}

Bu, döndürülecek bir şey olmasa bile, yönteminizden her zaman boş olmayan bir dönüş değeri almanızı sağlar. Bu, özellikle ne zaman nulliade @NonNulledilip edilemeyeceğini tespit eden araçlarla birlikte kullanıldığında , örneğin Eclipse ve @Nullableek açıklamalarla birlikte kullanıldığında güçlüdür .


5
Bence bu yanlış yöne gidiyor. Anlamı daha net bir şekilde aktaran çok daha kısıtlı bir tür döndürmek daha iyidir. An döndüren bir şeye sahip olmak Optional<Void>, verdiğiniz sebeple gereksizdir, her zamanOptional<Void> boş olanı alırsınız ve bu nedenle diğer tüm yöntemler anlamsızdır. Bu, isteğe bağlı bir değerin kullanılması gerektiğinin tam tersidir. Kullanırsınız çünkü bir değeri olabilir veya olmayabilir. Ayrıca derleyici, method()onu doğru şekilde uygulayan uygulayamaz. Bu çalışma zamanında başarısız olur: return Optional.of(null).
steinybot

3

Türünüz olarak hiçbir şeye ihtiyacınız yoksa, void'i kullanabilirsiniz. Bu, işlevleri veya eylemleri uygulamak için kullanılabilir. Daha sonra şuna benzer bir şey yapabilirsiniz:

interface Action<T> {
    public T execute();
}

abstract class VoidAction implements Action<Void> {
    public Void execute() {
        executeInternal();
        return null;
    }

    abstract void executeInternal();
}

Ya da soyut sınıfı atlayabilir ve dönüş değeri gerektirmeyen her eylemde dönüş null yapabilirsiniz.

Daha sonra bu eylemleri şu şekilde kullanabilirsiniz:

Bir yöntem verildiğinde

private static <T> T executeAction(Action<T> action) {
    return action.execute();
}

gibi arayabilirsin

String result = executeAction(new Action<String>() {
    @Override
    public String execute() {
        //code here
        return "Return me!";
    }
});

veya geçersiz eylem için (sonucu hiçbir şeye atamadığınızı unutmayın)

executeAction(new VoidAction() {
    @Override
    public void executeInternal() {
        //code here
    }
});

2
bu zaten sahip olduğumdan nasıl farklı? önerdiğim gibi hala boş döndürüyor
Robert

Neden başka bir şey iade etmek zorundasın? Yapmaya çalıştığım nokta, dönüş değerine ihtiyacınız olmamasıdır, bu yüzden ne döndüğünüz önemli değil. Düzenlememle bunu netleştirmeye çalıştım.
Jorn

1

Sırf bunun uğruna, Voidyansıma kullanarak örnek oluşturma olasılığı elbette var :

interface B<E>{ E method(); }

class A implements B<Void>{

    public Void method(){
        // do something

        try {
            Constructor<Void> voidConstructor = Void.class.getDeclaredConstructor();
            voidConstructor.setAccessible(true);
            return voidConstructor.newInstance();
        } catch (Exception ex) {
            // Rethrow, or return null, or whatever.
        }
    }
}

Muhtemelen bunu üretimde yapmayacaksınız.


0

Derleyiciye bir yöntemin hiçbir şey döndürmediğini söyleyen genel bir tür yoktur.

Kuralın bir tür parametresi olarak miras alırken Object kullanmak olduğuna inanıyorum

VEYA

Type parametresini yukarı doğru yayın ve ardından sınıfınızın kullanıcılarının Object kullanarak ve nesneyi bir tür joker karakterini kullanarak yazılan bir değişkene atamasına izin verin ?:

interface B<E>{ E method(); }

class A<T> implements B<T>{

    public T method(){
        // do something
        return null;
    }
}

A<?> a = new A<Object>();

1
bu, dönüş türünü jeneriklerle geçersiz kılmak için bir kural mı - bana çok boş görünmüyor mu?
Robert

Bunun gidilecek yol olduğuna inanıyorum. Sınıfın A<?>hiçbir kullanıcısı, döndürülen değeri herhangi bir şekilde kullanamayacaktır method().
Christopher Oezbek
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.