Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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 直接访问静态字段而不是调用静态getter方法,是否更快?_Java_Android_Dalvik_Performance - Fatal编程技术网

Java 直接访问静态字段而不是调用静态getter方法,是否更快?

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

我正在编写一个Android应用程序,我有一个类可以生成和维护一些固定的URL,这些URL偶尔会发生变化。我将它们都放在一个名为UrlUtils的类中:

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调用占用了不成比例的时间。这也是我主要担心的问题。但至少在某些情况下,性能优势太大,不容忽视。