Java 直接访问静态字段而不是调用静态getter方法,是否更快?
我正在编写一个Android应用程序,我有一个类可以生成和维护一些固定的URL,这些URL偶尔会发生变化。我将它们都放在一个名为UrlUtils的类中:Java 直接访问静态字段而不是调用静态getter方法,是否更快?,java,android,dalvik,performance,Java,Android,Dalvik,Performance,我正在编写一个Android应用程序,我有一个类可以生成和维护一些固定的URL,这些URL偶尔会发生变化。我将它们都放在一个名为UrlUtils的类中: public class UrlUtils { private static String sUrlBase = "http://google.com"; /** * Called occasionally */ public static void refreshUrlBases() { sUrlBa
public class UrlUtils {
private static String sUrlBase = "http://google.com";
/**
* Called occasionally
*/
public static void refreshUrlBases() {
sUrlBase = "http://yahoo.com/" + new Random().nextInt();
}
public static String getUrlBase() {
return sUrlBase;
}
}
我必须对上面的
getUrlBase()
进行大量调用,因此我考虑将sUrlBase
公开并直接访问它。这种方法在性能方面会更好吗?如果您不打算更频繁地更改url,那么我将说您可以直接保持静态,而不是getter/setter
方法
public static String google_url = "http://google.com";
public static String yahoo_url = "http://yahoo.com";
在保持静态
方法时,可能会由于某些问题静态
设置器
值被删除
(重置为原始值)。因此,在这种情况下,它将返回静态
值的原始
常量
更新:
如果您要动态地更新URL
,那么静态方法将被证明是更好的选择
public static String sUrlBase = "http://google.com";
public static String getsUrlBase() {
return sUrlBase;
}
public static void setsUrlBase(String sUrlBase) {
this.sUrlBase = sUrlBase;
}
这没什么区别。你应该使用对你来说最简单的方法。通常,为了可读性和代码实践,您应该使用getter和setter。是的,出于性能原因,您应该避免使用getter和setter。以下是来自android“”文档的提示
如果没有JIT,直接字段访问比调用
琐碎的获取者。使用JIT(直接现场访问与
直接现场访问速度约为本地访问速度的7倍
调用一个微不足道的getter。这在Froyo中是正确的,但在
当JIT内联getter方法时的未来
通常情况下,我不会像在本例中那样太担心URL这样的简单小数据的性能,因此,无论是直接字段访问还是使用方法访问,我都不会太在意。
对我来说,当getter调用的频率如此之高,以至于影响到整体响应时,情况就会有所不同。
我关心的是意外更改值[bugs:(],因为该字段具有公共静态访问权限。通过getter/setter访问时,至少有一个地方可以进行检查。我需要在refreshUrlBases()
中动态生成URL,所以这不起作用。(编辑示例代码以反映这一点。)现在,Proguard optimization已经相当内置到Android SDK中。我相信Proguard会将getter内联,因此,您将在优化器中实现两个方面的最佳效果。在该页面的最顶部还显示“明智地优化”,只有当你知道有问题时才进行优化。@Sean:我在《关于Proguard》中找不到任何参考资料。你知道我在哪里可以找到Proguard所做的优化吗?@Sean找不到任何东西表明Getter和Setter是由Proguard优化的。看看Yury发送的链接。你看到了吗“短的或只调用一次的内联方法。”?请遵循良好的设计实践,除非您已经分析了应用程序,并且您知道此getter调用占用了不成比例的时间。这也是我主要担心的问题。但至少在某些情况下,性能优势太大,不容忽视。