Я видел это в моих сгенерированных страницах GSP. Что означает ??
<g:textField name="name" value="${phoneInstance?.name}" />
Я видел это в моих сгенерированных страницах GSP. Что означает ??
<g:textField name="name" value="${phoneInstance?.name}" />
Это "безопасный навигатор", который является функцией Groovy, которая в кратчайшей степени избегает исключений из нулевого указателя. См. http://docs.groovy-lang.org/latest/html/documentation/index.html#_safe_navigation_operator
В этом случае, если phoneInstance
имеет значение null, он не пытается получить свойство name
и вызывает NPE - он просто устанавливает значение тега поля равным нулю.
Оператор ?
допускает нулевые значения в Groovy (и, следовательно, GSP). Например, обычно в gsp,
<g:field name="amount" value="${priceDetails.amount}" />
Если priceDetails
равно null, это вызовет NullPointerException
.
Если вместо этого использовать оператор ?
...
<g:field name="amount" value="${priceDetails?.amount}" />
теперь значение ${priceDetails?.amount}
равно null, вместо того, чтобы выбрасывать исключение нулевого указателя.
Это очень важная функция в Groovy. Если объект является нулевым (т.е. "phoneInstance" имеет значение NULL), тогда он предоставляет значение "null". Эта особенность называется "Safe Navigation Operator". Просто, когда мы используем эту функцию, нет необходимости в проверке объекта ( "phoneInstance" ) является нулевым или нет.
безопасный навигационный оператор (?.) возвращает null, если объект слева равен null, иначе он возвращает значение правого члена этого объекта. поэтому phoneInstance?.name
является только сокращенным для phoneInstance == null ? null : phoneInstance.name
например:
a = x?.y
просто сокращается для:
a = (x == null ? null : x.y)
который является сокращением для:
if(x == null){
a = null
} else {
a = x.y
}