Разница между MAP в Groovy и Java - PullRequest
1 голос
/ 04 августа 2020

В настоящее время мы используем Groovy в качестве внешнего интерфейса и Java Spring как серверную часть.

В groovy мы определяем свойство Map parameters = [:], которое будет присвоено private Map<String, Object> parameters; в Java.

У меня вопрос относительно экземпляра этого интерфейса MAP на обоих языках. Когда я прочитал groovy создать по умолчанию экземпляр LinkedHashMap и Java создать по умолчанию экземпляр HashMap, это правда?

Мое общее требование - сохранить порядок данных, который LinkedHashMap имеет, но HashMap нет.

Так как интерфейс уже LinkedHashMap, он будет передавать упорядоченные данные в бэкэнд.

public void setParameters(Map<String, Object> parameters) {
    this.parameters = parameters;
}

Это правда? Нужно ли менять модель в JAVA (бэкэнд) с Map на LinkedHashMap?

Ответы [ 2 ]

2 голосов
/ 04 августа 2020

Как я читал, groovy создать по умолчанию экземпляр LinkedHashMap и Java создать экземпляр HashMap по умолчанию, это правда?

Java, на самом деле, не • по умолчанию создавать любые карты. Разработчик выбирает, какую реализацию Map он создает (почти всегда). Java не имеет аналога для литерала карты Groovy [:], поэтому в Java нет типа «по умолчанию». Что касается Groovy, это правда, что литерал карты создает LinkedHashMap:

groovy:000> [:].getClass()
===> class java.util.LinkedHashMap

. Так как интерфейс уже является LinkedHashMap, он будет передавать упорядоченные данные в серверную часть. [...] это правда?

Да. Во время выполнения объект Map, переданный в setParameters(), будет генерироваться вашим "внешним" кодом. Вызов будет вести себя так же, как если бы вы создали LinkedHashMap из своего Java кода и передали его методу. Среда выполнения не будет преобразовывать объект в HashMap (даже если бы ему пришлось сделать что-то подобное, сделать его HashMap было бы любопытно произвольно). Здесь важно только то, что типы совместимы, а LinkedHashMap - это Map.

1 голос
/ 04 августа 2020

Map - интерфейс. Поэтому, если вы запрашиваете Map в качестве аргумента или параметра, вы запрашиваете только эти гарантии.

Если вы требуете дополнительных гарантий (например, что LinkedHashMap сохраняет порядок вставки), вам лучше запросить это явно.

Поскольку вы говорите "backend" и "frontend", существует также вопрос о транспорте между ними. Если вы используете транспорты (а не прямые вызовы), которые не могут поддерживать порядок на картах (например, JSON), тогда вам лучше не полагаться на разные типы данных. Например, используйте вместо этого список кортежей ключ-значение.

Боковое примечание о значениях по умолчанию

Groovy имеет литерал для быстрого создания карт ([:] или формы с ключами типа [a: 42]). Эти карты имеют вид LinkedHashMap, как вы заявили.

groovy:000> [:].getClass()
===> class java.util.LinkedHashMap

Поскольку Java до 15 не имеет буквального значения для карт, нет «по умолчанию» - по умолчанию это то, что вы делаете.

В общем, лучше всегда думать о типе данных, который вам действительно нужен. Это также означает, что литерал карты Groovy может быть неправильным выбором .

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