Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';它是最有效率的;创建新实例或更改现有实例中的值?_Java - Fatal编程技术网

Java 什么';它是最有效率的;创建新实例或更改现有实例中的值?

Java 什么';它是最有效率的;创建新实例或更改现有实例中的值?,java,Java,我正试图编写一个跟踪电影的应用程序,以此提高Java的使用能力。为此,我使用一个类“Movie”来表示电影本身,使用诸如“Title”、“Year”、“Director”等类来表示您可能期望的内容,这些都是通过“Movie”构造函数设置的。现在,如果我想更换一部电影的导演,那么在“电影”课程中,最有效的方法是什么?我将其归结为创建一个新实例,或更改旧实例,即 public void setYear(int year) { this.year = new Year(year); } 或

我正试图编写一个跟踪电影的应用程序,以此提高Java的使用能力。为此,我使用一个类“Movie”来表示电影本身,使用诸如“Title”、“Year”、“Director”等类来表示您可能期望的内容,这些都是通过“Movie”构造函数设置的。现在,如果我想更换一部电影的导演,那么在“电影”课程中,最有效的方法是什么?我将其归结为创建一个新实例,或更改旧实例,即

public void setYear(int year) {
    this.year = new Year(year);
}

最重要的是,我只是不确定第二个是否是正确的编码实践


我最近刚开始学习Java,所以我为我的问题中的任何混乱表示歉意。

像大多数性能问题一样,最好的答案是;首先要考虑简单、清晰的编码,这样通常性能就足够好了。如果您已经测量到您有一个问题,那么只需担心性能问题,否则您只是在猜测(即使您有十年的Java应用程序调优经验)

第一个例子是最简单的,也可能是最清楚的,尽管我不知道你为什么要上
课,因为你很乐意通过
int
一年。第二种方法速度更快,但更容易出错

如果您只是想要最高效的,请使用
int

最佳做法可能是将
年份
用作任何地方的不可变项,例如

public void setYear(Year year) {
    this.year = year;
}
例如,JodaTime有多种不可变的类来表示不同的时间段。

两者都不是:

典型的做法是

public void setYear(int year) {
    this.year = year;
}
你通常不需要一个学年

但是你应该考虑班上的观众:你需要检查有效的年份吗? 或者你信任打电话的人


从内存和速度性能来看,直接设置效率更高,尽管您很可能永远不会感觉到有什么不同。

分配对象总是很昂贵的。但是,为对象指定值(复制)也可能很昂贵,但通常成本较低。如果你希望你的代码经常被调用,性能是一个问题,那么考虑复制。否则,做最容易读写的事情。

用Don Knuth的话说,“……过早优化是万恶之源”


根据你的例子,第一个是最清楚的。我同意这一点。

您会问,创建新对象(分配内存、设置N个变量等)是否比更改现有对象中的单个值更有效……除非数量很大,否则您不会注意到差异。当您拥有大量数据时,显然创建一个新对象比更改现有字段中的单个字段更昂贵,但这仍然是一个相当小的差异。它通常不太重要(而且肯定不是一年中的小事),不需要担心;这取决于你的主观设计选择。从高层次的角度来看,这个问题是无关紧要的。从高层次的角度来看,我更喜欢第一个,它实际上不是更有效,但给你一个优势,年班是不可变的,我想我只是想得太多了。但是从主方法调用一个实例,然后再调用下一个实例,感觉很奇怪。谢谢,我将使用我最初使用的(setter)运行。大多数琐碎的代码优化(即内联移动函数、展开循环)都是在编译时执行的,或者是由运行字节码的VM执行的。“先担心简单、清晰的编码”。对我删除了所有与问题无关的代码,但我有一个“Year”类来检查某些条件,并在我向它提供值时运行进一步的代码。谢谢你的回答,我还有很多东西要学。比起代码级的微优化,担心程序设计和
O(n)
vs
O(logn)
要好得多。关于使用封装或创建新对象与重用它们的争论通常归结为将
O(1)
与其自身进行比较。有些代码确实与您创建多少对象有关,但它不到代码的1%,例如高频交易。正确性和清晰性应该始终放在第一位,如果需要的话,性能调优可以在以后进行。
public void setYear(int year) {
    this.year = year;
}