1

我正在用 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 ...因为这似乎只是一个荒谬的参数传递量。谢谢!

4

2 回答 2

3

Rect 类是不错的选择。

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

于 2013-04-19T07:20:36.830 回答
0

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

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

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

如果代码生成对象的修改形式比与其他代码交换它们的频率更高,那么可变类类型可能是首选。如果对象将被大量传递,但新形式的生成相对较少,则可能首选不可变类类型。请注意,可以(并且很常见)将可变类类型包装在不可变类类型中,该类类型包含对宇宙中任何地方的“可变”对象的唯一引用,并且既不改变该对象也不公开对可能做的任何事情的引用所以。我不知道是否有一个术语表示可变类型的对象实际上永远不会发生变异,但它通常是一种有用的模式(一个典型的例子是String;Java 中的数组是可变的,但是因为String永远不会改变它的字符数组并且永远不会将它暴露给外部代码,String对象中的字符序列永远不会改变。

于 2013-04-19T21:15:45.587 回答