给对象一个id并通过所述id引用它的自动方式?

时间:2017-01-23 20:07:51

标签: java refactoring code-cleanup

为垃圾标题道歉,如果有这个问题的术语,请更改它!感谢。

如何清理以下"模式"在我的代码中更自动化。通过这个我的意思是我可以创建一个扩展Foo的新对象,而不必为所述对象创建Foo的静态字段成员并将其添加到hashmap。

$queries = [
    "DELETE FROM foo WHERE 1 = 1;",
    "DELETE FROM bar WHERE 1 = 1;"
];

$connection = $this->getEntityManager()->getConnection();
$affectedRows = 0;

foreach($queries as $query)
{
    $statement = $connection->prepare($query);
    $statement->execute();
    $affectedRows = $affectedRows + $statement->getRowCount();
}

我的主要要求是我可以通过它的ID轻松地处理每个对象,即没有幻数:

class Foo { 
    protected int id;
    public Foo(int id) { this.id = id; }

    public static final int BAR = 0;
    public static final int QUX = 1;
    public static HashMap<Integer, Foo> FOOS = new HashMap<>();
    static {
        FOOS.put(BAR, new Bar());
        FOOS.put(QUX, new Qux());
    }
}

class Bar extends Foo {
    public Bar() { this(Foo.BAR); }
}

class Qux extends Foo {
    public Qux() { this(Foo.QUX); }
}

但是他们仍然需要一个整数,以便我可以放入一个随机数,它可以查找它引用的对象:

someArray[randomIndex] = Foo.BAR;

1 个答案:

答案 0 :(得分:0)

有点hackish,但你可以使用enum Foo处理对象和id:

enum Foo {
    QUX;

    private static int idIncrementor = 0;
    private int id;

    Foo() {
        this.id = idIncrementor++;
    }

    public int getId() {
        return id;
    }
}

然后将其嵌入到FooManager类中,该类处理映射:

class FooManager {
    private static HashMap<Integer, Foo> foos = new HashMap<>();

    static {
        for(Foo foo : Foo.values()) {
            foos.put(foo.getId(), foo);
        }
    }

    public static Foo getFoo(int id) {
        return foos.get(id);
    }

    //enum Foo goes here
}

然后,您可以添加新的枚举,而无需担心每次映射它们。

要访问对象,只需执行FooManager.getFoo(#)即可。 要查找对象的idFooManager.Foo.QUX.getId()