首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基本方向精神批判

基本方向精神批判
EN

Code Review用户
提问于 2014-01-03 03:45:32
回答 1查看 1K关注 0票数 6

我正在做一个简单的游戏,在这个游戏中,我需要追踪物体的基本方向。我尝试使用枚举的序数值,以及使用开关旋转,但两者似乎都错了。这就是我最后的下场。以下是一个适当的解决办法吗?

代码语言:javascript
复制
// Defines cardinal direction
public enum Direction {
    NORTH(0) {
        @Override
        public String getMessage() {
            return getDegrees() + " degrees due north";
        }
    },
    EAST(90) {
        @Override
        public String getMessage() {
            return getDegrees() + " degrees due east";
        }
    },
    SOUTH(180) {
        @Override
        public String getMessage() {
            return getDegrees() + " degrees due south";
        }
    },
    WEST(270) {
        @Override
        public String getMessage() {
            return getDegrees() + " degrees due west";
        }
    };

    private final int degrees;

    public abstract String getMessage();

    private Direction(final int degrees) {
        this.degrees = degrees;
    }

    public int getDegrees() {
        return degrees;
    }

    private static final Map<Integer, Direction> lookup = new HashMap<Integer, Direction>();

    static {
        for (Direction d : EnumSet.allOf(Direction.class))
            lookup.put(d.getDegrees(), d);
    }

    public static Direction get(int degrees) {
        return lookup.get(degrees);
    }

    public Direction rotateRight() {
        return Direction.get((degrees + 90) % 360);
    }

    public Direction rotateLeft() {
        return Direction.get((degrees + 270) % 360);
    }

}
EN

回答 1

Code Review用户

回答已采纳

发布于 2014-01-03 06:22:44

从概念上讲,这是一个很好的解决方案。我可以建议一些改变,但实际上它们是小的。它也将是‘乐趣’调整它abit,但在更大的图景,变化将是微小的.还是..。

我最大的观察是,构造函数可以简化很多。与其让每个Enum成员创建一个唯一的方法实现(而且该方法每次构建一个字符串--尽管编译器可能会修复它),不如使用以下方法来简化它:

代码语言:javascript
复制
private final int degrees;
private final String message;

private Direction(final int degrees, final String name) {
    this.degrees = degrees;
    this.message = degrees + " degrees due " + name;
}

public int getDegrees() {
    return degrees;
}

public String getMessage() {
    return message;
}

通过对构造函数的更改,您可以:

  1. 没有要实现的抽象方法
  2. 简单的消息,它是一个常量,而不是每次调用getMessage()时重新创建它。
  3. 你的枚举以更简单的方式初始化:北(0,“北”),东(90,东),南(180,南),西(270,西)

除此之外,代码相当不错,但是,有一种方法可以“玩”查找系统,只使用序数.考虑一下下面的代码(我让你来找出.);-):

代码语言:javascript
复制
public static Direction get(final int degrees) {
    int ordinal = ((degrees % 360) / 90) - ( 4 * (degrees % 90));
    return ordinal < 0 ?  null : values()[ordinal];
}    
票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/38473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档