考虑下面的 MouseListener。我的问题是:具有此侦听器提供的额外功能(其中一些您不需要)是否值得拥有这些功能所带来的内存和处理开销?还是应该避免像这样的“冗长”实现?
import java.awt.Component;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.Timer;
/**
 * This is an overkill class that is useful for distinguishing between buttons and includes functions for hold and double-click events.
 *
 * @author Paranoid Android
 */
public class ParanoidMouseListener extends MouseAdapter {
    public static final int LEFT = MouseEvent.BUTTON1;
    public static final int MIDDLE = MouseEvent.BUTTON2;
    public static final int RIGHT = MouseEvent.BUTTON3;
    private DoubleClickTimer leftDouble = new DoubleClickTimer();
    private DoubleClickTimer middleDouble = new DoubleClickTimer();
    private DoubleClickTimer rightDouble = new DoubleClickTimer();
    private MouseEvent event;
    private int pressedButton;
    private Component pressed;
    private boolean dragging;
    /**
     * This method allows methods to ignore the MouseEvent when not needed.
     *
     * @return the latest mouse event.
     */
    public MouseEvent getEvent() {
        return event;
    }
    private HoldTimer leftHold = new HoldTimer() {
        @Override
        public void perform() {
            onLeftHold();
        }
    };
    private HoldTimer middleHold = new HoldTimer() {
        @Override
        public void perform() {
            onMiddleHold();
        }
    };
    private HoldTimer rightHold = new HoldTimer() {
        @Override
        public void perform() {
            onRightHold();
        }
    };
    @Override
    public final void mouseClicked(MouseEvent event) {
        this.event = event;
        switch (event.getButton()) {
            case LEFT:
                if (leftDouble.isRunning()) {
                    leftDouble.stop();
                    onLeftDoubleClick();
                } else {
                    leftDouble.start();
                    onPureLeftClick();
                }
                break;
            case MIDDLE:
                if (middleDouble.isRunning()) {
                    middleDouble.stop();
                    onMiddleDoubleClick();
                } else {
                    middleDouble.start();
                    onPureMiddleClick();
                }
                break;
            case RIGHT:
                if (rightDouble.isRunning()) {
                    rightDouble.stop();
                    onRightDoubleClick();
                } else {
                    rightDouble.start();
                    onPureRightClick();
                }
                break;
        }
    }
    @Override
    public final void mousePressed(MouseEvent event) {
        this.event = event;
        pressedButton = event.getButton();
        pressed = event.getComponent();
        switch (event.getButton()) {
            case LEFT:
                leftHold.start();
                onLeftPress();
                break;
            case MIDDLE:
                middleHold.start();
                onMiddlePress();
                break;
            case RIGHT:
                rightHold.start();
                onRightPress();
                break;
        }
    }
    @Override
    public final void mouseReleased(MouseEvent event) {
        this.event = event;
        pressedButton = -1;
        Component src = event.getComponent();
        boolean contains = src.contains(event.getPoint());
        switch (event.getButton()) {
            case LEFT:
                leftHold.stop();
                onLeftRelease();
                if (!dragging && src == pressed && contains) onLeftClick();
                break;
            case MIDDLE:
                middleHold.stop();
                onMiddleRelease();
                if (!dragging && src == pressed && contains) onMiddleClick();
                break;
            case RIGHT:
                rightHold.stop();
                onRightRelease();
                if (!dragging && src == pressed && contains) onRightClick();
                break;
        }
        dragging = false;
    }
    @Override
    public final void mouseMoved(MouseEvent event) {
        this.event = event;
        moved();
    }
    @Override
    public final void mouseDragged(MouseEvent event) {
        this.event = event;
        dragging = true;
        switch (pressedButton) {
            case LEFT:
                onLeftDrag();
                break;
            case MIDDLE:
                onMiddleDrag();
                break;
            case RIGHT:
                onRightDrag();
                break;
        }
    }
    @Override
    public final void mouseEntered(MouseEvent event) {
        this.event = event;
        entered();
    }
    @Override
    public final void mouseExited(MouseEvent event) {
        this.event = event;
        exited();
    }
    private int getDoubleClickInterval() {
        String property = "awt.multiClickInterval";
        return (int) Toolkit.getDefaultToolkit().getDesktopProperty(property);
    }
    private class DoubleClickTimer extends Timer {
        public DoubleClickTimer() {
            super(getDoubleClickInterval(), null);
            this.setRepeats(false);
        }
    }
    public int getHoldInitialDelay() {
        return 300;
    }
    public int getHoldQueueDelay() {
        return 60;
    }
    private class HoldTimer extends Timer {
        public HoldTimer() {
            super(getHoldQueueDelay(), null);
            this.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    perform();
                }
            });
            this.setInitialDelay(getHoldInitialDelay());
        }
        public void perform() {
        }
    }
    public void moved() {
    }
    public void entered() {
    }
    public void exited() {
    }
    public void onLeftHold() {
    }
    public void onMiddleHold() {
    }
    public void onRightHold() {
    }
    public void onLeftClick() {
    }
    public void onMiddleClick() {
    }
    public void onRightClick() {
    }
    public void onPureLeftClick() {
    }
    public void onPureMiddleClick() {
    }
    public void onPureRightClick() {
    }
    public void onLeftDoubleClick() {
    }
    public void onMiddleDoubleClick() {
    }
    public void onRightDoubleClick() {
    }
    public void onLeftPress() {
    }
    public void onMiddlePress() {
    }
    public void onRightPress() {
    }
    public void onLeftRelease() {
    }
    public void onMiddleRelease() {
    }
    public void onRightRelease() {
    }
    public void onLeftDrag() {
    }
    public void onMiddleDrag() {
    }
    public void onRightDrag() {
    }
}