我应该用Java替换小结构?

时间:2013-04-19 05:43:54

标签: java oop struct maps idiomatic

我正在用Java构建一个映射应用程序,我有一个关于传递小对象的问题。假设我想表示窗口显示为矩形的区域,我想查询哪个图块位于该矩形内,以便我知道要加载哪些图块。在C ++中,我刚刚创建了一个Rect结构并包含了一个tileInRect方法。对Java的最直接的翻译就是:

class Rect {
    float x, y, width, height;

    public boolean tileInRect(Tile t) {
        // yada yada
    }
}

class MyProgram {
    public void main(String[] args) {
        while (windowIsOpen()) {
            // event loop
            // render map
            Rect r = getVisibleRect();
            for (Tile t : tiles) {
                if (r.tileInRect(t)) {
                    // etc.
                }
            }
        }
    }
}

但是这对我来说有些蠢,因为我可能会在每一帧都制作一个新的Rect。是否有更好,更规范的方式来表示Java中的这些轻量级对象?我真的不想编写像tileInRect(Tile t, int rect_x, int rect_y, int ...这样的辅助方法,因为这似乎只是一个荒谬的参数传递量。谢谢!

2 个答案:

答案 0 :(得分:3)

Rect类是最好的方法。

如果你必须创建很多这些对象,但只需要它们一次,只需通过更新其属性为每个调用重用相同的对象。

答案 1 :(得分:0)

可以使用不可变类类型或可变类类型。 .NET中的理想表示形式是一个暴露字段结构(在大多数情况下它应该是可变的,并且在大多数情况下它应该是不可变的),但是因为Java不支持任何这样的概念一个人必须选择一个可变类或一个不可变类,认识到每个类的优点和缺点。

一个可变类具有的优点是,如果一个人拥有对象的唯一现存引用,则希望有一个在某种程度上不同的对象,并且一个将不再需要旧版本的对象,可以简单地无需创建新对象即可更改对象的相应部分,而无需复制或以其他方式对对象的某些部分执行任何操作,而无需更改。一个可变类具有的缺点是,如果只有一个对象存在唯一的现有引用,那么这种突变只是安全的,人们不能安全地与其他代码共享对象的引用;一个人必须改为创建新对象并将其提供给其他代码,或者将数据从一个人自己的对象复制到另一个代码提供的对象中。

不可变类的优点是可以自由地与外部代码共享对象的引用,而不必担心该代码可能对该对象做什么(因为该对象是不可变的,外部代码不能做任何事情!)。不幸的是,虽然外面对对象无能为力是很好的,但不变性也意味着即使对象的逻辑“所有者”也无法对它做任何事情。如果一个人有一个对象并希望有一个在某种程度上不同的对象,那么必须生成一个与这个方式不同的全新对象。即使事实上宇宙中的任何地方都没有人会关心旧对象是否被修改过,但通常没有哪种代码能够知道这一点。

如果代码生成修改后的对象形式的频率高于将其与其他代码交换的类型,则可以选择可变类类型。如果对象将被大量传递,但是新表单的生成将相对不频繁,则可以优选不可变类类型。请注意,将可变类类型包装在不可变类类型中是可能的(也是常见的),该类型保存对Universe中任何位置的“可变”对象的唯一引用,并且既不会改变该对象也不会将引用暴露给任何可能执行的操作。所以。我不知道是否有一个可变类型的对象的术语实际上永远不会变异,但它通常是一个有用的模式(一个主要的例子是String; Java中的数组是可变的,但是因为{{{永远不会改变它的字符数组并且永远不会将它暴露给外部代码,String对象中的字符序列无法改变。