Java:包含内部枚举的接口; 扩展实现类中的功能

Mat*_*ewD 9 java enums interface

我有一个如下界面:

package example;
import java.awt.Point;

public interface Thing {
    public enum MovingState {
        MOVING_LEFT,
        MOVING_UP,
        MOVING_RIGHT,
        MOVING_DOWN
    }

    public void setNewPosition(MovingState state);
    public Point getPosition();
}
Run Code Online (Sandbox Code Playgroud)

和实现类:

package example;
import java.awt.Point;

public class ThingImpl implements Thing {
    public enum MovingState {
        MOVING_LEFT (-1, 0),
        MOVING_UP (0, -1),
        MOVING_RIGHT (1, 0),
        MOVING_DOWN (0, 1);

        private int x_move;
        private int y_move;

        MovingState(int x, int y) {
            x_move = x;
            y_move = y;
        }

        public int xMove() {
            return x_move;
        }

        public int yMove() {
            return y_move;
        }
    }


    private Point position;

    public void setNewPosition(MovingState state) {
        position.translate(state.xMove(), state.yMove());
    }

    public Point getPosition() {
        return position;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是具有MovingStateThingImpl延伸MovingStateThing接口(从而分离所述实际实施方式的MovingState从接口).

这不起作用 - MovingState枚举在ThingImpl阴影中定义界面而不是扩展它,然后编译器抱怨ThingImpl不是抽象的并且不会覆盖Thing中的抽象方法setNewPosition(Thing.MovingState).

有没有一种实际的方法来做我想要实现的目标?或者Java根本没有这种能力?

Met*_*002 11

你真正想要做的是从你的"ThingImpl"类中删除枚举声明,并将所有这些声明(包括它的构造函数和getter)移动到Thing界面中.

让你的字段在枚举中最后记住它们不应该被触及.

以这种方式,任何希望使用Thing接口的东西都必须使用你接口上定义的枚举 - 你的问题是你有效地定义了两次,但它应该在接口上(如果只使用它就没问题)对于此接口)或作为公共级枚举Java文件(使用公共枚举而不是公共类).如果你的界面之外的其他东西可以合理地期望使用它,你就会把它变成公共枚举 - 在我看来,Map.Entry是一个糟糕的嵌套接口,因为其他类用于地图外部的键/值对因此它应该是它自己的界面,但我们必须忍受它:(

我们的想法是让ThingImpl中的MovingState从Thing接口扩展MovingState(从而将MovingState的实际实现与接口分开).

我不认为这是你的想法 - 我认为你在Thing接口上指定的行为很好,你真的不想触摸MovingState枚举,因为它很好.但是,如果您认为某些内容需要不同的MovingState实现,则可以使其实现名为MovingState的接口,从而可以重命名枚举DefaultMovingState.这是你的选择.

您的MovingState接口将立即拥有您在MovingState中公开的getter.两种方法.


pol*_*nts 5

你无法扩展,enum因为它是final.

您可能希望阅读Effective Java 2nd Edition,Item 34:使用接口模拟可扩展枚举.从本质上讲,这归结为enum自身implements Something.