Soru Bir arabirimi karşılamak için var olan boş yöntemler için Java'da bir deyim var mı?


Diyelim ki bir dersim var Foo gibi bir arayüzün uygulanması MouseListener. MouseListener Arayüz beş yöntemden oluşuyor ama ben sadece birini geçersiz kılmak istiyorum (mouseClicked()). Diğer yöntemleri biçimlendirmenin standart ve idiomatik bir yolu var mı?

Eğilimim aşağıdakileri yazmaktı:

@Override
public void mouseClicked(MouseEvent e) {
    // (...) <-- actual code here
}

@Override
public void mouseEntered(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}

@Override
public void mouseExited(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}

@Override
public void mousePressed(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}

@Override
public void mouseReleased(MouseEvent e) {
    // Do nothing.  Exists to satisfy MouseListener interface.
}

Bu yöntemlerin kazara birakmak yerine kasıtlı olarak boşluk bıraktığını açıkça gösterme hayranıyım, ama temelde hiçbir şey için verilen tüm dikey alan hakkında deli değilim. Aşağıdaki biçimi de gördüm:

public void mouseClicked(MouseEvent e) {
    // (...) <-- actual code here
}

public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}

Ben genellikle bu konuda iyiyim ve yazarın niyetini anlıyorum, ama ne zaman gerçekten çirkinleşir (Tavsiye edilen) @Override ek açıklamalar eklenir.

Özellikle deneyimli bir Java kodlayıcısı değilim, bu yüzden bir kongre var mı diye soracaktım. Düşünceler?


24
2018-05-19 18:19


Menşei


MouseAdapter sınıfının farkındasınız, değil mi? java.sun.com/javase/6/docs/api/java/awt/event/MouseAdapter.html - Michael Myers♦


Cevaplar:


Bunu yaptığınız gibi yapıyorum, eğer hiçbir şey bir satırda kalmazsa. Belki de 'uygulama tek gömlekleri' büyük bir blok üstüne bir yorum koydu.


8
2018-05-19 18:23





Bu durumda, wilums2'nin tavsiyelerini takip etmeli ve MouseListener'ı uygulamak yerine MouseAdapter'i genişletmelisiniz. Bu bağdaştırıcı sınıflarının amacı, yalnızca bir arabirimin bazı yöntemlerini uygularken boş uygulamalar sağlamak zorunda kalmamanızdır.

Daha genel olarak, kısa cevap 'hayır', boş yöntemlerin nasıl belgeleneceğine dair standart bir sözleşme yoktur, ancak genellikle

@Override
void foo() {
  // No implementation necessary
}

6
2018-05-19 18:29





MouseAdapter kullan


5
2018-05-19 18:21



Bu cevap doğru olsa da, bir arayüzün sadece bir kısmı uygulandığında ne yapılması gerektiği sorusunun ruhuna değinmez. - Andrew Hare
O, hangi arayüzün uygulanacağını değil, konvansiyonları istiyor. - Jan Gressmann
Bir MouseEvent dinleyicisi oluşturmak için bu sınıfı genişletin ve ilgili etkinliklerin yöntemlerini geçersiz kılın. (MouseListener arabirimini uygularsanız, içindeki tüm yöntemleri tanımlamanız gerekir. Bu soyut sınıf, hepsi için geçersiz yöntemleri tanımlar, böylece yalnızca önem verdiğiniz etkinlikler için yöntemler tanımlamanız gerekir.) java.sun.com/j2se/1.4.2/docs/api/java/awt/event/... - Bill the Lizard
MouseAdapter için kaynak, herhangi bir iyi bir kongre olurdu. Bununla birlikte, yönteme bağlı olduğunu iddia ediyorum. MouseListener durumunda, bir uygulama sağlayıp sağlamadığınızı belirtmenize gerek yoktur. Diğer arayüzler için, bir istisna atmak uygun olabilir ve diğerlerinde, yöntemin hiçbir şey yapmadığının kaydedilmesi uygun olabilir. - user101884


Genel olarak, bahsettiğiniz şey Boş Nesne Kalıbının bir uzantısıdır. Boş Nesneyi tanımlamak ve sadece önem verdiğiniz yöntemleri geçersiz kılarak genişletmek.

Bunu otomatik hale getirmenin bir yolu olarak, JavaDude Bean Ek Açıklamalarımda (http://code.google.com/p/javadude/wiki/Annotations), aşağıdaki gibi bir şey yapabilirsiniz. [NOT: MouseListener için bunu yapmayacağınız, MouseAdapter zaten var ve ben sadece alt sınıfı olabilir ... Önizleme birkaç seçim yöntemleri uygulamak istediğiniz diğer büyük arabirimler için yararlıdır]

@Bean(nullObjectImplementations = @NullObject(type=MouseListener.class))
public class MyMouseHandler extends MyMouseHandlerGen {
    public void mouseClicked(MouseEvent e) {
        // your handling of a MouseClick
    }
}

Daha sonra, MyMouseHandler'ı tıklatıp işlemek için kullanabilirsiniz.

Not: MouseAdapter bir Gerçekten mi JRE / JDK'daki sınıfın adı için kötü seçim. GoF Adaptörü modelinin bir örneği değil; Bir MouseListener'ın gerçekten boş bir nesne uygulamasıdır.

BTW: @Override yöntem beyanı ile aynı hatta koyabilirsiniz - örneğiniz için

@Override public void mousePressed(MouseEvent e) { /* not needed */ }
// et al

5
2018-05-20 14:00





Bunu yapmanın birkaç yolu var. Oracle java sözleşmeleri p6.4 (sayfa 11) boş yöntemlerin benzemesi gerektiğini söylüyor.

public void empty() {}

Tarafından da bir belge var Steve Yohanan 2003 yılında yazılan karınca diyor

public void empty()
{
}

"Arabirim saplaması olarak boş yöntem" için herhangi bir kuralı bulamadım. Sonuç olarak, bunu yapmanın standart bir yolu yoktur. Bazıları yorum yapmayı tercih ediyor, bazıları tek satırlık yapmayı tercih ediyor, bazıları boş gövdeli başka bir yöntem olarak yazıyor.


2
2018-01-10 11:59



OP'nin istediği gibi kodlama kurallarına bir bağlantı sağladığınız için teşekkür ederiz. - amertkara


MouseAdapter bu özel durum için harika ve Adaptör deyimi genel olarak harika. Bir Bağdaştırıcı, arabirimin tüm yöntemlerini içeren boş uygulamalara sahip olup, yalnızca sınıfınızla ilişkili olan yöntemleri alt sınıflara ayırmanıza ve bunları uygulamanıza olanak tanır. Bağdaştırıcı, alternatif olarak, Andrew Hare'in önerdiği gibi, NotImplementedException öğelerini attırabilir.


1
2018-05-19 18:26





Bir dinleyicinin amacı, bazı olaylardan haberdar edilmek zorundadır. Dinleyici arabirimi ihtiyacınız olandan daha fazla geri çağırma yöntemi içeriyorsa, umursamadığınızları göz ardı edin. Senin durumunda MouseAdapter Bu tam amaç için tasarlanmıştır. Yap değil atmak UnsupportedOperationException arayan büyük olasılıkla istisna beklemiyor gibi. Her yöntemin uygulanmasının beklendiği gibi, büyük olasılıkla dinleyici arayüzünün sözleşmesini de ihlal ediyor.


1
2018-05-19 18:31



Arayan, muhtemelen hiçbir şey yapmama işlevini beklemiyordur. Hiçbir şey yapmadan, hata ayıklama hataları için tuhaf ve son derece zor olacak arabirim sözleşmesini ihlal ettiniz. Ben hata atmak istiyorum ki sorun test / kullanım sırasında hemen ortaya çıkıyor. Bir hata atamazsanız, en azından Desteklenmeyen Bir İşlemin çağrıldığına dair bir uyarı vermeniz gerekir. Kesinlikle hiçbir şey yapmamak, maliyetli bir hata olabilir (sonuçta oluşan hataların hata ayıklanması zamanında). (Şüphe duyduğunuzda, en azından oturum açın, böylece hataların neden olduğu hatalar için en azından iyi bir ipucu olsun) - Tezra


Sanırım bunu "no-op implementasyonu" olarak tanımlayabilirim veya belki "adaptör" terimini kullanırım. Diğerleri de belirttiği gibi, Java MouseAdapter İstediğiniz şeyi yapan sınıf. Kesin olarak, bir API'yi diğerine dönüştüren Bağdaştırıcı modelinin tanımına girmiyor, ama açıkçası ben böyle şeylerin isimlendirilmesi konusunda pragmatik olma eğilimindeyim.

Muhtemelen yapılacak en önemli şey, yöntemin hiçbir uygulamaya sahip olmaması niyetinde olduğudur. Özel durumda MouseAdaptermuhtemelen fırlatmak istemezsiniz UnsupportedOperationExceptionama genel olarak, bir uygulama sağlamaya niyet etmemenizin iyi bir işaretidir. Arabirimi tam olarak neden uygulamadığınızı açıklamak için kaynak koddaki bir yorum (veya daha iyi yöntem metodu) genellikle gereklidir.


0
2018-05-19 18:32





Özellikle önemli değil bence. Kişisel zevklerim için açılışın yanındaki kapanış parantezini görmek istemiyorum:

public void mouseEntered(MouseEvent e) {
}

Biraz boş ama tamam. Bir dönüş değeri durumunda, tutarlı görünmesini sağlayabiliriz. [] tarzı.

Ama döngülerdeki nadir durum söz konusu olduğunda, orada bir noktalı virgül isterim:

// Made up example.
while (++i < len && str.charAt(i) != '\0') {
    ;
}

Hangi verir ki:

public void mouseEntered(MouseEvent e) {
    ;
}

Bu durumuda catch cümleleri, bir yorumda iyi bir mazeret olsanız iyi olur (belki de bir kesinti bırakır).


0
2018-05-19 18:36





Bu kesin soruyu ararken bunu buldum. OnScrollStateChanged'e ihtiyaç duyduğum ancak onScroll'a ihtiyaç duymadığım kaydırma işlemini kullanıyorum. Ben eğildim:

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
            int totalItemCount) {
    return;         
} 

Ancak, verdiğiniz ikinci örneği beğendim (aynı satırda parantez ile). Kompakt ve temizdir ve bilerek boş bırakıldığı fikrini tutarlı bir şekilde ifade edebilir.

Düzenleme: Bu, yerleştiğim şey:

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
            int totalItemCount) {return;}

Bu bir çok parametreye sahip, bu yüzden bir satırdaki kadar güzel görünmüyor, ancak fikri anlıyorsunuz.


0
2017-08-25 14:06