Я пытаюсь создать ArrayList массивов, но он не будет компилироваться должным образом [дублировать]

Давайте посмотрим на лес сначала, прежде чем смотреть на деревья.

Здесь есть много информативных ответов с большими подробностями, я не буду повторять ни одного из них. Ключ к программированию в JavaScript имеет сначала правильную ментальную модель общего исполнения.

  1. Ваша точка входа (ов) выполняется в результате события. Например, в браузер загружается тег сценария с кодом. (Соответственно, поэтому вам, возможно, придется заботиться о готовности страницы запускать ваш код, если он требует, чтобы элементы dom были сконструированы первыми и т. Д.)
  2. Ваш код выполняется до завершения, однако многие асинхронные вызовы, которые он делает, без выполнения каких-либо ваших обратных вызовов, включая запросы XHR, установку тайм-аутов, обработчиков событий dom и т. д. Каждый из этих обратных вызовов, ожидающих выполнения, будет находиться в очереди, ожидая, что их очередь будет запущена после других событий
  3. Каждый отдельный обратный вызов XHR-запроса, установленного таймаута или dom события после вызова будет завершен.

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

Но вы не должны использовать какие-либо тактические инструменты для решения проблемы, пока вам не понравится актуальная проблемная область. Нарисуйте карту этих зависимостей, чтобы знать, что нужно запускать, когда. Попытка ad-hoc подхода ко всем этим обратным вызовам просто не поможет вам.

1
задан isnot2bad 16 April 2015 в 17:02
поделиться

6 ответов

Вы не можете свободно выполнять инструкции в классе. Они должны быть внутри метода. Я рекомендую вам добавить эту строку в конструктор класса или в блок инициализации класса.

В конструкторе класса:

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...
}

Дополнительная информация:

4
ответ дан Community 31 August 2018 в 10:25
поделиться

Вы не можете делать то, что вы предлагаете, вместо этого вы можете инициализировать переменную с помощью java.utils.Arrays.asList(T) следующим образом:

public class Test{
    private List<String> foo = new ArrayLis<>(Arrays.asList("a", "b", "c"));
}
0
ответ дан Axxiss 31 August 2018 в 10:25
поделиться

Если вы используете Guava ( https://code.google.com/p/guava-libraries/ ), у вас будет этот сахарный код:

private ArrayList<String> list = Lists.newArrayList("element1", "element2", ...)

Кроме того, было упомянуто ранее, я предлагаю не печатать ваше поле как ArrayList, а как List. Всегда используйте более абстрактный тип, правильное правило большого пальца.

1
ответ дан Claudio 31 August 2018 в 10:25
поделиться

Этот код не будет вызываться, если он находится за пределами определенной функции для класса. Если бы это было разрешено, все внутри класса было бы выполнено, как только вы создали класс, который не является желательным.

0
ответ дан Code Whisperer 31 August 2018 в 10:25
поделиться

Это незаконно, потому что инициализация полей в точности является причиной, почему существуют конструкторы!

В 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");
    }
}
1
ответ дан isnot2bad 31 August 2018 в 10:25
поделиться

Если вы хотите инициализировать некоторые элементы, вы можете сделать это следующим образом:

private ArrayList<String> list = new ArrayList<>(java.util.Arrays.asList("asdf"));
0
ответ дан mamboking 31 August 2018 в 10:25
поделиться
Другие вопросы по тегам:

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