Если частные вспомогательные методы статичны, если они могут быть статичными

Вам нужно указать xAxis.type ( Highcharts Doc ), чтобы он работал следующим образом:

        ...
        var xAxis = {
            type:'category'
        }
        ...
        json.xAxis = xAxis;

Fiddle

196
задан Raedwald 22 July 2014 в 00:56
поделиться

16 ответов

Я предпочитаю такие вспомогательные методы быть private static; который прояснит читателю, что они не изменят состояние объекта. Мой IDE также покажет вызовы статическим методам курсивом, таким образом, я буду знать, что метод является статическим, не смотря подпись.

168
ответ дан blong 23 November 2019 в 05:18
поделиться

Я объявил бы, что они столь же статичный отмечают их как не сохраняющий состояние.

Java не имеет лучшего механизма для незначительных операций, которые не экспортируются, таким образом, я думаю, что частные помехи приемлемы.

0
ответ дан Uri 23 November 2019 в 05:18
поделиться

Одна причина состоит в том, что, при этом все остальное - равные вызовы статического метода, должно быть быстрее. Статические методы не могут быть виртуальными, и не берут неявное эта ссылка.

1
ответ дан dsimcha 23 November 2019 в 05:18
поделиться

Более конкретно к примеру Вы дали, кажется, что цель определить эти методы больше для ясности кода при чтении его, чем для функциональности (они определены как частные). В этом случае движение с помехами действительно ничего не делает для Вас, так как цель помех состоит в том, чтобы выставить функциональность класса.

2
ответ дан notnot 23 November 2019 в 05:18
поделиться

static/non-static вопрос сводится, "я должен буду действительно использовать объект этого класса"?

Так, Вы передаете объект между различными методами? Объект содержит информацию, которая полезна вне контекста статических методов? Разве там какая-либо причина не состоит в том, чтобы определить методы оба пути при использовании их обоих пути?

, Если Вы находитесь в этой дилемме, мне кажется, что у Вас есть все данные, требуемые для метода, плавающего вокруг в Вашем коде за пределами объекта. Это то, что Вы хотите? Было бы легче просто, всегда собирают те данные в объект каждый раз? Вы могли бы просто быть двойственными о согласии на единственную модель. Если можно сделать все это с помощью одного пути, то выберите или статичный или нестатичный и пойдите с ним.

2
ответ дан notnot 23 November 2019 в 05:18
поделиться

Я хотел бы разъяснить немного вещей, которые другие плакаты сказали как его предоставление неправильной информации.

Во-первых, так как методы закрыты, даже если Вы объявите их статичный, то Вы не сможете получить доступ к ним за пределами этого класса. Во-вторых, они являются частными, таким образом, Вы даже не можете переопределить в подклассе, таким образом статичный или нестатичный не имеет никакого значения. В-третьих, нестатический закрытый метод можно назвать от конструктора класса также, это не должно быть статично.

Теперь прибытие в Ваш вопрос, если частный вспомогательный метод должен быть определен как статичный или нестатичный. Я пойду с ответом Steve как маркировка закрытого метода статические шоу, что этот метод является не сохраняющим состояние, поскольку я также следую этому правилу, когда я кодирую.

3
ответ дан Bhushan Bhangale 23 November 2019 в 05:18
поделиться

Если метод является в основном просто подпрограммой, которая никогда не будет обозримо использовать информацию состояния, объявлять это статичный.

Это позволяет этому использоваться в других статических методах или в инициализации класса, т.е.:

public class Example {
   //...

   //Only possible if computeOne is static
   public final static double COMPUTED_ONE = computeOne(new Something("1"));

   //...
}
4
ответ дан Kip 23 November 2019 в 05:18
поделиться

или какая-либо конкретная причина не к [объявляют их как статичных]?

Да.

Путем хранения их как методов экземпляра, Вы позволяете себе обеспечить другую реализацию позже.

Это может звучать глупым (и на самом деле это было бы, если те методы используются только Вами в 50 программах строки), но в объемных приложениях, или в библиотеках, пользовавшихся кем-то еще, Вы можете решить выбрать лучшую реализацию, но не хотите взламывать существующий код.

, Таким образом, Вы создаете подкласс и возврат, что в новых версиях, и так как методы были объявлены как методы экземпляра, Вы просто позволяете полиморфизму сделать свое задание.

Кроме того, Вы могли извлечь выгоду из создания частного конструктора и обеспечить статический метод фабрики по той же причине.

Так, моя рекомендация состоит в том, чтобы сохранить их как методы экземпляра и избежать статичный, если это возможно.
Используют в своих интересах динамизм, который обеспечивает язык.

Посмотрите здесь для несколько связанного видео: , Как разработать хороший API и почему он имеет значение

, Хотя он непосредственно не связан с "помехами по сравнению с экземпляром" обсуждение метода, он затрагивает некоторые интересные моменты в дизайне API.

5
ответ дан mskfisher 23 November 2019 в 05:18
поделиться

Я не могу действительно думать о ясных преимуществах для частного статического метода. Однако нет никаких определенных преимуществ для создания их нестатичны также. Это - главным образом вопрос презентации: Вы могли бы хотеть сделать их статичными для ясного подчеркивания того, что они не изменяют объект.

Для метода с различными правами доступа, я думаю, что существует два основных аргумента:

  • статические методы можно назвать, не создавая экземпляр объекта, который может быть полезен
  • , статические методы не могут быть наследованы, который может быть проблемой, если Вам нужен полиморфизм (но не важно для закрытых методов).

Помимо этого, разница является довольно небольшой, и я сильно сомневаюсь, что дополнительное, которое этот указатель передал методу экземпляра, имеет значительное значение.

10
ответ дан Axelle Ziegler 23 November 2019 в 05:18
поделиться

Одна причина Вы могли бы хотеть объявить статические вспомогательные методы, состоит в том, если необходимо назвать их в конструкторе класса "прежде" this или super. Например:

public class MyClass extends SomeOtherClass { 
    public MyClass(String arg) {
       super(recoverInt(arg));
    }

    private static int recoverInt(String arg) {
       return Integer.parseInt(arg.substring(arg.length() - 1));
    }
}

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

11
ответ дан oxbow_lakes 23 November 2019 в 05:18
поделиться

Ответ..., он зависит.

, Если участник является переменной экземпляра, характерной для объекта, Вы имеете дело с, затем почему передача он в качестве параметра вообще?

, Например:

public class Example {
   private Something member;

   public double compute() {
       double total = 0;
       total += computeOne();
       total += computeMore();
       return total;         
   }

   private double computeOne() { /* Process member here */ }
   private double computeMore() { /* Process member here */ } 
}
18
ответ дан Powerlord 23 November 2019 в 05:18
поделиться

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

18
ответ дан Steve B. 23 November 2019 в 05:18
поделиться

Это могло бы привести к немного меньшему байт-коду, так как статические методы не получат доступ к this. Я не думаю, что это имеет любое значение в скорости (и если бы это сделало, то это, вероятно, было бы слишком маленьким, чтобы иметь значение в целом).

я сделал бы их статичными, так как я обычно делаю так если вообще возможный. Но это - просто я.

<час>

РЕДАКТИРОВАНИЕ: Этот ответ продолжает получать downvoted, возможно из-за необоснованного утверждения о размере байт-кода. Таким образом, я на самом деле запущу тест.

class TestBytecodeSize {
    private void doSomething(int arg) { }
    private static void doSomethingStatic(int arg) { }
    public static void main(String[] args) {
        // do it twice both ways
        doSomethingStatic(0);
        doSomethingStatic(0);
        TestBytecodeSize t = new TestBytecodeSize();
        t.doSomething(0);
        t.doSomething(0);
    }
}

Байт-код (полученный с javap -c -private TestBytecodeSize):

Compiled from "TestBytecodeSize.java"
class TestBytecodeSize extends java.lang.Object{
TestBytecodeSize();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

private void doSomething(int);
  Code:
   0:   return

private static void doSomethingStatic(int);
  Code:
   0:   return

public static void main(java.lang.String[]);
  Code:
   0:   iconst_0
   1:   invokestatic    #2; //Method doSomethingStatic:(I)V
   4:   iconst_0
   5:   invokestatic    #2; //Method doSomethingStatic:(I)V
   8:   new     #3; //class TestBytecodeSize
   11:  dup
   12:  invokespecial   #4; //Method "<init>":()V
   15:  astore_1
   16:  aload_1
   17:  iconst_0
   18:  invokespecial   #5; //Method doSomething:(I)V
   21:  aload_1
   22:  iconst_0
   23:  invokespecial   #5; //Method doSomething:(I)V
   26:  return

}

Вызов статического метода берет два байт-кода (byteops?): iconst_0 (для аргумента) и invokestatic.
Вызов нестатического метода берет три: aload_1 (для эти TestBytecodeSize объект, я предполагаю), iconst_0 (для аргумента), и invokespecial. (Обратите внимание, что, если бы они не были закрытыми методами, это было бы invokevirtual вместо [1 111]; см. JLS В§7.7 Вызов Methods .)

Теперь, поскольку я сказал, я не ожидаю там быть любой большой разницей в производительности между этими двумя кроме того, которое invokestatic требует того меньше байт-кода. invokestatic и invokespecial должно оба быть немного быстрее, чем [1 115], так как они оба используют статическое связывание вместо динамического, но я понятия не имею, быстрее ли любой, чем другой. Я не могу найти хорошие ссылки также. Самое близкое, которое я могу найти, эта статья JavaWorld 1997 года, которая в основном вновь заявляет о том, что я просто сказал:

самые быстрые инструкции, скорее всего, будут invokespecial и invokestatic, потому что методы, вызванные этими инструкциями, статически связываются. Когда JVM разрешит символьную ссылку для этих инструкций и заменит ее прямой ссылкой, та прямая ссылка, вероятно, будет включать указатель на фактические байт-коды.

, Но много вещей изменились с 1997.

Так в заключении... Я предполагаю, что все еще придерживаюсь с тем, что я сказал прежде. Скорость не должна быть причиной выбрать один по другому, так как это будет микрооптимизация в лучшем случае

108
ответ дан Michael Myers 23 November 2019 в 05:18
поделиться

Мое предпочтение в случаях как они состоит в том, чтобы сделать computeOne и computeMore статические методы. Причина: инкапсуляция. Чем меньше кода, который имеет доступ к реализации Вашего класса, тем лучше.

В примере Вы даете, Вы заявляете, что computeOne и computeMore не должен должен быть получать доступ к внутренностям класса, итак, почему дают возможность для специалистов по обслуживанию класса для влезания во внутренности.

3
ответ дан maxaposteriori 23 November 2019 в 05:18
поделиться

Как говорили многие, сделай это как статический ! Вот правило большого пальца, которому я следую: если вы думаете, что метод - это просто математическая функция , т.е. он не имеет состояния, не включает никаких переменных экземпляра (=> нет переменных синего цвета [в затмении] в методе ), и результат метода будет одинаковым для n вызовов (конечно, с теми же параметрами), затем пометьте этот метод как STATIC.

И если вы считаете, что этот метод будет полезен для другого класса, переместите его в класс Util, в противном случае поместите метод как закрытый в том же классе. (минимизация доступности)

0
ответ дан 23 November 2019 в 05:18
поделиться

Не по теме: я бы сохранил вспомогательные методы в отдельном служебном / вспомогательном классе, содержащем только статические методы.

Проблема с наличием вспомогательных методов в точке использования (читай «тот же класс») заключается в том, что кто-то в дальнейшем может просто разместить свои собственные несвязанные вспомогательные методы в том же месте

1
ответ дан 23 November 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: