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;
}
}
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;
}
}
Yanıtlar:
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:
Object
ve dönen new Object()
veyanull
Void
ve geri dönmenull
NullObject
seninki ile parametrelendirmeBu yöntemi yapamaz void
ve başka bir şey döner bir şey . Bu bir şey göz ardı edildiğine göre, her şeyi iade edebilirsiniz.
return (Void)null;
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 null
iade @NonNull
edilip edilemeyeceğini tespit eden araçlarla birlikte kullanıldığında , örneğin Eclipse ve @Nullable
ek açıklamalarla birlikte kullanıldığında güçlüdür .
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)
.
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
}
});
Sırf bunun uğruna, Void
yansı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.
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>();
A<?>
hiçbir kullanıcısı, döndürülen değeri herhangi bir şekilde kullanamayacaktır method()
.