gpt4 book ai didi

Java - 嵌套级别对象分配

转载 作者:行者123 更新时间:2023-12-01 16:50:45 24 4
gpt4 key购买 nike

我目前正在处理许多嵌套级别对象,并且正在考虑性能。

假设我有以下类(class):

class Address {
private String doorNumber;
private String street;
...
}

还有另一个类 Customer。

class Customer {
private List<Address> addressList;
private String firstName;
.....
.....
.....
}

当我尝试像下面这样访问它时:

public static void main(String[] str) {
Customer customer = new Customer();
// ... and add addresses to this Customer object.

// Set 1
// And if I then do...
customer.getAddressList().get(0).getHouseNumber();
customer.getAddressList().get(0).getStreet();

// OR
// Set 2
Address address = customer.getAddressList().get(0);
address.getHouseNumber();
address.getStreet()
}

我知道访问地址的第一组行不是干净的代码,我假设编译器会解决这个问题,但事实并非如此。因为当我反编译代码时,我得到完全相同的结果,所以不确定编译器是否在那里进行任何优化。所以我的第一个问题是为什么编译器不清理它并将其分配给临时变量?

我的下一个问题是,这与性能有关吗?除了第一个不是非常干净的代码之外,哪一个是两者中性能更佳的代码。这是否意味着我的第二组代码会在编译期间在内部转换为第一组代码?

最后一个问题是,在类上调用变量是否比其 getter 方法更优化?我只是在考虑性能而不需要干净的编码。

最佳答案

副作用。

考虑这种情况,调用 get 方法会产生一些内部副作用,而不是返回一些文本:

// This goes up each time getAddressList is called.
public int addressesRequested;

public List<Address> getAddressList(){
addressesRequested++;
return addressList;
}

当然,在这种方法中,这种副作用没有多大意义,但是方法调用可以通过多种方式留下某种形式的遗留效果。

customer.getAddressList(); // addressesRequested is now 1.
customer.getAddressList(); // addressesRequested is now 2.
...

因此,编译器无法将多个方法调用优化为一个 - 它必须假设方法调用有副作用。

还值得注意的是,方法也可以内联 - 即方法主体被复制到调用站点以避免方法调用开销。这通常仅在 JVM 认为值得进行此类优化时才会发生;即因为它被频繁调用。但是,它不会导致调用站点进一步优化 - 它不会在那里触发某种临时变量。

字段怎么样?它们不会产生副作用......可以吗?

好吧,你现在正在考虑这个:

// Assume addressList was public and could be accessed like so:
customer.addressList.get(0)..
customer.addressList.get(0)..
..

它们不会产生副作用,但编译器也不会将其放入临时变量中。这是因为副作用是双向的 - 其他一些方法可能会更改该地址列表字段;最有可能来自其他线程。

关于Java - 嵌套级别对象分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40636191/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com