Почему Eclipse требует, чтобы я установил (произвольные) скобки в коде Java? - PullRequest
0 голосов
/ 11 июля 2011

В настоящее время я пытаюсь понять, как использовать Eclipse для программирования моделей Escape на Java.Я совершенно новичок в Escape и Eclipse, и я давно программировал на java, поэтому прошу прощения, если это глупый вопрос.

По сути, меня преследуют странные сообщения об ошибках Eclipse.Я отследил последнюю проблему до этой проблемы:

Это работает:

public class CoordinationGame extends Scape {

.
    .
    .
    Scape lattice;

boolean test;
int test2;

{
test = true;
test2 = 3;
}

{
lattice = new Scape(new Array2DVonNeumann());
}

}

Это выдает странные сообщения об ошибках:

public class CoordinationGame extends Scape {

    .
.
.

Scape lattice;

boolean test;
int test2;

test = true;
test2 = 3;

lattice = new Scape(new Array2DVonNeumann());
}

то есть { ожидаемое значение int test2 и Syntax error on token "lattice", VariableDeclaratorId expected after this token.

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

Кто-нибудь знает, почему Eclipse требует, чтобы я установил эти скобки, или чтоЯ мог бы изменить это поведение?

Заранее спасибо!Мартин

PS: Некоторая информация, которая, вероятно, будет полезна:

Я использую eclipse-indigo, установил инструментарий моделирования AMP.Я не совсем уверен, как это проверить, но я полагаю, что я использую jre6, поскольку это то, что написано на вкладке JRE System Library моего проводника пакетов.В будущем я планирую найти способ запуска среды моделирования Escape с помощью Groovy, но это будет другой вопрос…

Ответы [ 5 ]

5 голосов
/ 11 июля 2011

Это не имеет ничего общего с вашей IDE.Java не допускает операторов на уровне класса, однако разрешает инициализаторы на уровне класса.

{foo();}

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

В Java вы можете написать операторы в

  • методе
  • конструкторе (это особый видметода)
  • блок инициализатора (статический или экземпляр)

, но больше нигде.

3 голосов
/ 11 июля 2011

Если вы отделяете инициализацию поля от объявления, вам нужен метод или инициализатор.Этот экземпляр работает без инициализаторов:

package ede.brook.model;

import org.ascape.model.Scape;

public class CoordinationGame extends Scape {

    public int latticeHeight = 30;
    public int latticeWitdh = 30;
    public int nPlayers = 200;

    Scape lattice  = new Scape(new Array2DVonNeumann());;
    Scape players;

    boolean test = true;
    int test2 = 3;

    test = true;
    test2 = 3;

}

Если присутствует инициализатор, они выполняются перед конструкторами.

Что касается практики кодирования, я рекомендовал бы против инициализаторов и использовать комбинированное объявление +инициализация для простых случаев или (без параметров) конструкторы для более сложных конструкций.Исключением являются статические инициализаторы, которые могут быть необходимы для более сложных инициализаций:

static SomeTypeWithComplexInitialization staticField;

static {
  SomeOtherType factoryParameter = new SomeOtherType()
  staticField = SomeTypeFactory.createInstance(factoryParameter);
}

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

context.checking(new Expectations() {{
    oneOf (subscriber).receive(message);
}});
1 голос
/ 11 июля 2011
public class CoordinationGame extends Scape {    
  // ...
  int test2;
  // ...
  test2 = 3;  // <- errror
}

Это недопустимо, мы не можем назначать значения таким образом в теле класса.Другой код был допустим, потому что вы использовали статический инициализатор для инициализации поля test2.

Сообщение об ошибке довольно вводит в заблуждение, но, честно говоря, такое случается довольно часто в Java;)

0 голосов
/ 11 июля 2011

Если вы хотите инициализировать решетку полей, test и test2, попробуйте использовать следующее:

    package ede.brook.model;

    import org.ascape.model.Scape;

    public class CoordinationGame extends Scape {

    private static final long serialVersionUID = 1L;

    public int latticeHeight = 30;
    public int latticeWitdh = 30;
    public int nPlayers = 200;

    Scape lattice = new Scape(new Array2DVonNeumann());
    Scape players;

    boolean test = true;
    int test2 = 3;

    }
0 голосов
/ 11 июля 2011

Если вы хотите инициализировать переменные test и test2, вы должны сделать это в точке объявления.

boolean test = true;
int test2 = 3;

Добавленные { и } создают блок инициализатора, который позволяет избежать ошибки. Это немного странный способ сделать что-то, поэтому я всегда предпочел бы видеть переменные, инициализированные в точке объявления, если это возможно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...