Javaでinterfaceを実装する際に、全ての抽象メソッドは実装したくない

ソフトウェアを作る際に、よくお世話になるインターフェースとして
「MouseListener」や「DropTargetListener」などがありますが、
これらを実装すると、全ての抽象メソッドを実装しなければなりません。

「MouseListener」の場合は
・void mouseClicked(MouseEvent e)
・void mouseEntered(MouseEvent e)
・void mouseExited(MouseEvent e)
・void mousePressed(MouseEvent e)
・void mouseReleased(MouseEvent e)
の5つ。

「DropTargetListener」の場合は
・void dragEnter(DropTargetDragEvent dtde)
・void dragExit(DropTargetEvent dte)
・void dragOver(DropTargetDragEvent dtde)
・void drop(DropTargetDropEvent dtde)
・void dropActionChanged(DropTargetDragEvent dtde)
の5つ。

結構あります。
そして、私の場合このうちの幾つかは毎度毎度実装のみで使いません。
例えば「DropTargetListener」の場合、私は「drop()メソッド」くらいしか使わないことはほとんどです。

使わないのに実装して、ソースコードが長くなるのがなんとなく嫌だったので、
全ての抽象メソッドを実装しない(ように見せかける)方法のメモです。

いろいろ試行錯誤しましたが、結局インターフェースの抽象メソッドを実装するためだけのクラスを作って、
それを継承するという方法に落ち着きました。

「DropTargetListener」「MouseListener」「MouseMotionListener」の3つのインターフェースを実装し、
「JCmponent」クラスを継承したクラス「DropTargetPanel.java」の例です。

import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.JComponent;

public  class DropTargetPanel extends JComponent implements DropTargetListener, MouseListener, MouseMotionListener{

    @Override
    public void drop(DropTargetDropEvent dtde) { }

    @Override
    public void dragEnter(DropTargetDragEvent dtde) { }

    @Override
    public void dragOver(DropTargetDragEvent dtde) { }

    @Override
    public void dropActionChanged(DropTargetDragEvent dtde) { }

    @Override
    public void dragExit(DropTargetEvent dte) { }

    @Override
    public void mouseClicked(MouseEvent me) { }

    @Override
    public void mousePressed(MouseEvent me) { }

    @Override
    public void mouseReleased(MouseEvent me) { }

    @Override
    public void mouseEntered(MouseEvent me) { }

    @Override
    public void mouseExited(MouseEvent me) { }

    @Override
    public void mouseDragged(MouseEvent me) { }

    @Override
    public void mouseMoved(MouseEvent me) { }
    
}

この「DropTargetPanel」クラスを継承させることで、
目的の抽象メソッドのみを見かけ上実装することができました。

また、「MouseListener」や「MouseMotionListener」は、
新しいクラスを用意しなくても、次のような命令をコンストラクタで書いても実現できました。

        addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                formMouseMoved(e);
            }
        });

「formMouseMoved()」メソッドを外部に書き、上記のような宣言の命令群をまとめて隠すことで、なんとなくスッキリ・・・するかもしれません。


コメントを残す

メールアドレスが公開されることはありません。