Каковы затраты на обертывание статического вызова метода в объекте метода? - PullRequest
1 голос
/ 05 марта 2012

Давайте предположим следующий фрагмент кода:

public class NotThatWellWrittenClass {
   public static void doSmth() {
      /* 
        This code part is actually irrelevant.
      */
   }
}

Некоторые другие классы будут использовать этот параметр следующим образом: NotThatWellWrittenClass.do(), поэтому единственные накладные расходы на самом деле связаны с выполнением вызова метода ,

Мне действительно не нравится программировать таким образом, поэтому я хотел бы реорганизовать эту часть кода, не нарушая при этом клиентов, использующих статический вызов метода.Рефакторированный фрагмент:

public class NotThatWellWrittenClass {
   public static void doSmth() {
      new WorkUtil().doSmth();
   }
}

public class WorkUtil() {
   public void doSmth() {
      /* 
          This code part is actually irrelevant.
      */
   }
}

Теперь код стал намного более объектно-ориентированным и его проще тестировать и использовать повторно.Однако теперь он создает дополнительный объект (назначение памяти) и выполняет вызов метода экземпляра вместо статического вызова (который, я полагаю, оптимизируется JVM по-разному).

Итак, вернемся к вопросу:Рефакторинг обеспечивает какие-либо заметные накладные расходы?Может быть, это должно быть выполнено другим способом?(Я всегда мог кэшировать экземпляр моего объекта, но стоит ли это того?)

Я хотел бы получить более подробное объяснение, спасибо.

1 Ответ

0 голосов
/ 05 марта 2012

Методы, которые являются маленькими, например 35 байт, может быть встроен.

Только методы, которые часто вызываются, оптимизируются таким образом. например 10000 раз или более.

Если он редко вызывается, то должно иметь значение, если это все равно займет несколько наносекунд.

Если WorkUtil.do () достаточно прост, распределение объектов может быть оптимизировано. Единственная альтернатива - перерабатывать объект самостоятельно. Это довольно редко, что вам действительно нужно это сделать.

public class NotThatWellWrittenClass {
   private static final WorkUtil THE_WORK_UTIL = new WorkUtil();
   public static void do() {
      // could introduce thread safety issues as the object is now shared.
      THE_WORK_UTIL.do();
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...