Давайте посмотрим на лес сначала, прежде чем смотреть на деревья.
Здесь есть много информативных ответов с большими подробностями, я не буду повторять ни одного из них. Ключ к программированию в JavaScript имеет сначала правильную ментальную модель общего исполнения.
Хорошие новости заключается в том, что, если вы хорошо понимаете этот момент, вам никогда не придется беспокоиться о гоночных условиях. Прежде всего вы должны понимать, как вы хотите упорядочить свой код как по существу ответ на разные дискретные события, и как вы хотите объединить их в логическую последовательность. Вы можете использовать обещания или новые асинхронные / ожидающие более высокие уровни в качестве инструментов для этой цели, или вы можете откатывать свои собственные.
Но вы не должны использовать какие-либо тактические инструменты для решения проблемы, пока вам не понравится актуальная проблемная область. Нарисуйте карту этих зависимостей, чтобы знать, что нужно запускать, когда. Попытка ad-hoc подхода ко всем этим обратным вызовам просто не поможет вам.
Вы не можете свободно выполнять инструкции в классе. Они должны быть внутри метода. Я рекомендую вам добавить эту строку в конструктор класса или в блок инициализации класса.
В конструкторе класса:
public class Test {
// some instance variables...
private List<String> list = new ArrayList<>();
public Test() {
list.add("asdf");
}
// methods here...
}
В блоке инициализации класса:
public class Test {
// some instance variables...
private List<String> list = new ArrayList<>();
{
list.add("asdf");
}
// methods here...
}
Дополнительная информация:
Вы не можете делать то, что вы предлагаете, вместо этого вы можете инициализировать переменную с помощью java.utils.Arrays.asList(T)
следующим образом:
public class Test{
private List<String> foo = new ArrayLis<>(Arrays.asList("a", "b", "c"));
}
Если вы используете Guava ( https://code.google.com/p/guava-libraries/ ), у вас будет этот сахарный код:
private ArrayList<String> list = Lists.newArrayList("element1", "element2", ...)
Кроме того, было упомянуто ранее, я предлагаю не печатать ваше поле как ArrayList, а как List. Всегда используйте более абстрактный тип, правильное правило большого пальца.
Этот код не будет вызываться, если он находится за пределами определенной функции для класса. Если бы это было разрешено, все внутри класса было бы выполнено, как только вы создали класс, который не является желательным.
Это незаконно, потому что инициализация полей в точности является причиной, почему существуют конструкторы!
В Java невозможно иметь код где-либо «вне» метода или конструктора (или инициализатор класса ). В инициализаторе поля могут быть простые выражения, но не несколько операторов:
public class Test {
// here, at class level, you can only declare fields, methods or constructors!
// But you cannot have procedural code!!!
// field without initializer (=> default initialization with null)
private List<String> list1;
// field with explicit initializer expression
private List<String> list2 = new ArrayList<String>();
public Test() {
// initialize fields
this.list1 = new ArrayList<>();
this.list2.add("asdf");
}
}
Если вы хотите инициализировать некоторые элементы, вы можете сделать это следующим образом:
private ArrayList<String> list = new ArrayList<>(java.util.Arrays.asList("asdf"));