def против окончательного def в Groovy - PullRequest
0 голосов
/ 01 июня 2018

Я написал простой тест в Groovy с использованием Spock framework

class SimpleSpec extends Specification {

    def "should add two numbers"() {
        given:
            final def a = 3
            final b = 4
        when:
            def c = a + b
        then:
            c == 7
    }
}

Переменная a объявлена ​​с использованием комбинации def и final ключевых слов.Переменная b объявляется с использованием только ключевого слова final.

Мой вопрос: в чем разница (если есть) между этими двумя объявлениями?Должен ли один подход быть добавлен к другому?Если так, то почему?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Пользователь Даггетт верно, final не делает локальную переменную окончательной в Groovy.Ключевое слово влияет только на членов класса.Вот небольшая иллюстрация:

package de.scrum_master.stackoverflow

import spock.lang.Specification

class MyTest extends Specification {
  def "Final local variables can be changed"() {
    when:
    final def a = 3
    final b = 4
    final int c = 5
    then:
    a + b + c == 12

    when:
    a = b = c = 11
    then:
    a + b + c == 33
  }

  final def d = 3
  static final e = 4
  final int f = 5

  def "Class or instance members really are final"() {
    expect:
    d + e + f == 12

    when:
    // Compile errors:
    // cannot modify final field 'f' outside of constructor.
    // cannot modify static final field 'e' outside of static initialization block.
    // cannot modify final field 'd' outside of constructor.
    d = e = f = 11
    then:
    d + e + g == 33
  }
}

Обновление: Я переключил один из своих проектов Spock на версию 1.3 с Groovy 2.5 и заметил, что этот тест больше не компилируется из-закомпилятор, обнаруживающий переназначение конечных локальных переменных.Т.е. несоответствие в Groovy <= 2.4 кажется исправленным. </p>

0 голосов
/ 01 июня 2018

конечные переменные, объявленные внутри методов, обрабатываются как обычные переменные в groovy

проверьте класс ниже и тот, который сгенерирован Groovy (2.4.11)

ps: возможно given:секция в споке генерирует код иначе ... enter image description here

...