将id从int更改为对象表示

时间:2014-04-10 23:17:11

标签: java

我们做了一个很大的代码更改,改变了一个节点id,它曾经由一个int表示,现在由NodeId对象表示。现在具有挑战性的任务是识别所有使用object ==的地方将它们更改为.equals()。对于!=运算符也是如此。

是否有任何存在或可以编写的脚本或任何可以比手动眼球更准确地识别位置的脚本?

感谢您的帮助!

非常感谢。

1 个答案:

答案 0 :(得分:0)

不幸的是,我认为你运气不好。 NetBeans不支持二进制运算符的“查找用法”,快速的Web搜索不会显示任何其他可能的工具。具有讽刺意味的是,如果您想将NodeId.equals()替换为==,“查找用法”将是正确的工具。

您是否考虑过使NodeId不可变并使用工厂模式使NodeId的每个等效实例都是唯一的?然后,您无需替换==!=。这也比使用equals()更快,但会使对象创建时间更长。对于一个简单的问题,这似乎是一个过于复杂的解决方案,但请考虑以后错过==!=错误的问题。相比之下,您可以在比手动搜索==!=所花费的时间更短的时间内编写工厂代码,并且应该很容易进行单元测试。

以下是一个简单示例,其中NodeId的不同实例的等效性取决于int。修改HashMap键以适合您的用例。如果您不需要多个工厂,则可以使用静态工厂方法和静态映射而不是类。

public class NodeId {
    private final int id;

    private NodeId(int id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof NodeId) return id == ((NodeId)obj).id;
        else return false;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 29 * hash + this.id;
        return hash;
    }

    public static class Factory {
        Map<Integer, NodeId> assigned = new HashMap<>();

        public NodeId getInstance(int id) {
            NodeId nodeId = assigned.get(id);
            if (nodeId == null) {
                nodeId = new NodeId(id);
                assigned.put(id, nodeId);
            }
            return nodeId;
        }
    }
}

一个简单的测试类演示了用法。

public class Test {
    public static void main(String[] args) {
        NodeId.Factory factory = new NodeId.Factory();
        NodeId a = factory.getInstance(42);
        NodeId b = factory.getInstance(42);
        NodeId c = factory.getInstance(3);
        System.out.println(a == b); // Should print "true"
        System.out.println(a == c); // Should print "false"
    }
}