Java 创建新对象与在函数中设置其变量

Java 创建新对象与在函数中设置其变量,java,android,performance,Java,Android,Performance,我有一个Rectangle类,它的构造函数将每个变量(x,y,width,height)设置为一个特定的值。创建矩形后,如果要更改其所有值。要做到这一点,像rect.set(newX,newY,newWidth,newHeight)这样的函数是否更有效或调用构造函数r1=new矩形(newX,newY,newWidth,newHeight)又一次?(因为我不再引用较旧的矩形) 我可以想象,创建一个新的矩形会产生垃圾,所以情况应该更糟。这是真的吗?还是java以某种方式优化了这一点?更改对象属性是

我有一个
Rectangle
类,它的构造函数将每个变量(x,y,width,height)设置为一个特定的值。创建
矩形后,如果要更改其所有值。要做到这一点,像
rect.set(newX,newY,newWidth,newHeight)这样的函数是否更有效
或调用构造函数
r1=new矩形(newX,newY,newWidth,newHeight)又一次?(因为我不再引用较旧的
矩形


我可以想象,创建一个新的矩形会产生垃圾,所以情况应该更糟。这是真的吗?还是java以某种方式优化了这一点?

更改对象属性是一种方法!一旦您开始创建多个矩形,您将拥有多个对象,并且一旦实例化,您可以任意使用它们,这就是OOP编程的全部要点!另一种方法也很有效,但就我个人而言,我会使用我刚才解释的方法

快乐编码,
丰富取决于你的设计和动机。
我倾向于使用不可变对象,这样我就可以使用返回新矩形的setter,或者使用静态工厂方法来创建新矩形


当然,这只是我的观点,有时会导致编写更多的代码,但由于对象“无法更改”,JVM应该能够更好地解释对象,并可能应用优化

这是一个相当古老的问题。做什么在很大程度上取决于你的任务

当然,创建对象与变异现有对象相比有一些开销,但在大多数情况下,它可以忽略不计。从设计的角度来看,整体创建新对象是更好的方法

Hotspot JVM(桌面)针对创建大量短期对象进行了高度优化

阅读更多:

然而,在其他平台上,如Android,过度的对象创建可能会导致明显的GC暂停,因此应该避免

UPD 通过收集评论中的零碎信息,我可以得出以下结论:

  • 您正在为Android编写游戏
  • 您在每个时刻都有一个逻辑
    矩形
    实例
  • 您正在对其进行大量修改(可能是在某个方法中的一个周期内)
在这些条件下,唯一合理的方法是对矩形的单个实例进行变异

理由:

  • 避免Android上的GC暂停
  • 在方法/类中封装变异的
    Rectangle
    实例(在性能关键点违反一些设计实践是完全可以的,只要这些点被封装并且您知道自己在做什么)

一般来说,我的偏好是使Java应用程序中尽可能多的对象不可变。通过这种方式,您可以避免一系列问题,特别是在并发性方面,否则可能会使您更难对应用程序的行为进行推理

这意味着避免添加setter和其他方法,这些方法可能会在构建后改变对象的值

对于简单地聚合数据的对象尤其如此,例如您正在描述的
Rectangle


关于不变性还有更多的讨论。

就我个人而言,我更喜欢集合。面向对象编程的基础是将实体看作一个特定的对象。在您的例子中,矩形是您通过“New rectangle”调用实例化的对象

如果更改其大小,则必须使用“集合”来更改对象,而不是创建该矩形的另一个“邪恶孪生体”


这是我的拙见。

当您处理数百万个实例时,这些实例可能存储在某种集合中。您很可能会使用基于x/y/width/height的hashcode/equals。如果对象是可变的,则在识别集合中的现有对象时可能会遇到问题

最好的解决方案可能是使用,但这还不是一个选项

从设计的角度来看,在使用不可变对象时,您很可能避免许多问题,因为对象的标识取决于您要更改的属性

编辑:


但是,如果一次只有一个经常更改的矩形实例,则应保留对可变对象的一个引用并更改其值。也请参见艾维安的答案。

没错,这取决于很多事情,但我认为总体而言(如果我们谈论优化而不是设计),“set”解决方案将更高效且“独立于平台”(Android)

就我个人而言,我总是避免创建很多对象,我总是尽可能地重用它,尤其是在Android上,试图避免GC之类的坏东西和糟糕的内存使用


但这只是我的哲学

嗯……除非有一个
矩形
实例,否则不能调用
set
(如上定义)。如果不调用设置属性的构造函数,就无法获得
矩形
实例(如上所述)。@t.J.Crowder我知道,我的问题是在初始化后更改矩形的值。我不是编程新手。你的问题真的不清楚。你到底想比较什么?(这怎么不是难以置信的微观优化呢?)如果你想比较这两件事,第一步是明确无误地定义这两件事。@T.J.Crowder我想你应该更像这样阅读他的问题:分配新rect之间的性能差距有多大,人们可能更喜欢可变的矩形而不是不变的矩形。假设旧的ReCt不再被引用。@ Shiro:考虑更新问题,让它更清楚。游戏开发和Android是我正在做的,对象是ReT。
public Rectangle (int x, int y, int width, int height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
}

public void set (int x, int y, int width, int height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
}