Вам нужно указать xAxis.type
( Highcharts Doc ), чтобы он работал следующим образом:
...
var xAxis = {
type:'category'
}
...
json.xAxis = xAxis;
Я предпочитаю такие вспомогательные методы быть private static
; который прояснит читателю, что они не изменят состояние объекта. Мой IDE также покажет вызовы статическим методам курсивом, таким образом, я буду знать, что метод является статическим, не смотря подпись.
Я объявил бы, что они столь же статичный отмечают их как не сохраняющий состояние.
Java не имеет лучшего механизма для незначительных операций, которые не экспортируются, таким образом, я думаю, что частные помехи приемлемы.
Одна причина состоит в том, что, при этом все остальное - равные вызовы статического метода, должно быть быстрее. Статические методы не могут быть виртуальными, и не берут неявное эта ссылка.
Более конкретно к примеру Вы дали, кажется, что цель определить эти методы больше для ясности кода при чтении его, чем для функциональности (они определены как частные). В этом случае движение с помехами действительно ничего не делает для Вас, так как цель помех состоит в том, чтобы выставить функциональность класса.
static/non-static вопрос сводится, "я должен буду действительно использовать объект этого класса"?
Так, Вы передаете объект между различными методами? Объект содержит информацию, которая полезна вне контекста статических методов? Разве там какая-либо причина не состоит в том, чтобы определить методы оба пути при использовании их обоих пути?
, Если Вы находитесь в этой дилемме, мне кажется, что у Вас есть все данные, требуемые для метода, плавающего вокруг в Вашем коде за пределами объекта. Это то, что Вы хотите? Было бы легче просто, всегда собирают те данные в объект каждый раз? Вы могли бы просто быть двойственными о согласии на единственную модель. Если можно сделать все это с помощью одного пути, то выберите или статичный или нестатичный и пойдите с ним.
Я хотел бы разъяснить немного вещей, которые другие плакаты сказали как его предоставление неправильной информации.
Во-первых, так как методы закрыты, даже если Вы объявите их статичный, то Вы не сможете получить доступ к ним за пределами этого класса. Во-вторых, они являются частными, таким образом, Вы даже не можете переопределить в подклассе, таким образом статичный или нестатичный не имеет никакого значения. В-третьих, нестатический закрытый метод можно назвать от конструктора класса также, это не должно быть статично.
Теперь прибытие в Ваш вопрос, если частный вспомогательный метод должен быть определен как статичный или нестатичный. Я пойду с ответом Steve как маркировка закрытого метода статические шоу, что этот метод является не сохраняющим состояние, поскольку я также следую этому правилу, когда я кодирую.
Если метод является в основном просто подпрограммой, которая никогда не будет обозримо использовать информацию состояния, объявлять это статичный.
Это позволяет этому использоваться в других статических методах или в инициализации класса, т.е.:
public class Example {
//...
//Only possible if computeOne is static
public final static double COMPUTED_ONE = computeOne(new Something("1"));
//...
}
или какая-либо конкретная причина не к [объявляют их как статичных]?
Да.
Путем хранения их как методов экземпляра, Вы позволяете себе обеспечить другую реализацию позже.
Это может звучать глупым (и на самом деле это было бы, если те методы используются только Вами в 50 программах строки), но в объемных приложениях, или в библиотеках, пользовавшихся кем-то еще, Вы можете решить выбрать лучшую реализацию, но не хотите взламывать существующий код.
, Таким образом, Вы создаете подкласс и возврат, что в новых версиях, и так как методы были объявлены как методы экземпляра, Вы просто позволяете полиморфизму сделать свое задание.
Кроме того, Вы могли извлечь выгоду из создания частного конструктора и обеспечить статический метод фабрики по той же причине.
Так, моя рекомендация состоит в том, чтобы сохранить их как методы экземпляра и избежать статичный, если это возможно.
Используют в своих интересах динамизм, который обеспечивает язык.
Посмотрите здесь для несколько связанного видео: , Как разработать хороший API и почему он имеет значение
, Хотя он непосредственно не связан с "помехами по сравнению с экземпляром" обсуждение метода, он затрагивает некоторые интересные моменты в дизайне API.
Я не могу действительно думать о ясных преимуществах для частного статического метода. Однако нет никаких определенных преимуществ для создания их нестатичны также. Это - главным образом вопрос презентации: Вы могли бы хотеть сделать их статичными для ясного подчеркивания того, что они не изменяют объект.
Для метода с различными правами доступа, я думаю, что существует два основных аргумента:
Помимо этого, разница является довольно небольшой, и я сильно сомневаюсь, что дополнительное, которое этот указатель передал методу экземпляра, имеет значительное значение.
Одна причина Вы могли бы хотеть объявить статические вспомогательные методы, состоит в том, если необходимо назвать их в конструкторе класса "прежде" 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
не может быть метод экземпляра в этом случае.
Ответ..., он зависит.
, Если участник является переменной экземпляра, характерной для объекта, Вы имеете дело с, затем почему передача он в качестве параметра вообще?
, Например:
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 */ }
}
Мое персональное предпочтение состояло бы в том, чтобы объявить их статичный, поскольку это - ясный флаг, что они являются не сохраняющими состояние.
Это могло бы привести к немного меньшему байт-коду, так как статические методы не получат доступ к 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.
Так в заключении... Я предполагаю, что все еще придерживаюсь с тем, что я сказал прежде. Скорость не должна быть причиной выбрать один по другому, так как это будет микрооптимизация в лучшем случае
Мое предпочтение в случаях как они состоит в том, чтобы сделать computeOne
и computeMore
статические методы. Причина: инкапсуляция. Чем меньше кода, который имеет доступ к реализации Вашего класса, тем лучше.
В примере Вы даете, Вы заявляете, что computeOne
и computeMore
не должен должен быть получать доступ к внутренностям класса, итак, почему дают возможность для специалистов по обслуживанию класса для влезания во внутренности.
Как говорили многие, сделай это как статический ! Вот правило большого пальца, которому я следую: если вы думаете, что метод - это просто математическая функция , т.е. он не имеет состояния, не включает никаких переменных экземпляра (=> нет переменных синего цвета [в затмении] в методе ), и результат метода будет одинаковым для n вызовов (конечно, с теми же параметрами), затем пометьте этот метод как STATIC.
И если вы считаете, что этот метод будет полезен для другого класса, переместите его в класс Util, в противном случае поместите метод как закрытый в том же классе. (минимизация доступности)
Не по теме: я бы сохранил вспомогательные методы в отдельном служебном / вспомогательном классе, содержащем только статические методы.
Проблема с наличием вспомогательных методов в точке использования (читай «тот же класс») заключается в том, что кто-то в дальнейшем может просто разместить свои собственные несвязанные вспомогательные методы в том же месте