#class #grails #groovy #initialization
#класс #grails #groovy #инициализация
Вопрос:
У меня есть вопрос об инициализации с помощью groovy / grails. Когда у меня есть следующий класс, sInstance не передается в инициализацию SService.
class A {
String sInstance
String app
String dbInstance
SService s = new SService(sInstance:sInstance, app:app)
}
Класс SService:
class SService {
String sInstance
String app
public getSInstance{
return sInstance
}
}
Это возвращает значение null, где
class A {
String sInstance
String app
String dbInstance
public initializeSService{
SService s = new SService(sInstance:sInstance, app:app)
}
}
возвращает переменную sInstance из класса SService.
Почему это так и как я могу инициализировать объект SService с помощью конструктора класса A?
Ответ №1:
Вы не можете сделать что-то подобное:
class A {
String sInstance
String app
String dbInstance
SService s = new SService(sInstance:sInstance, app:app)
}
Проблема в том, что когда вы создаете экземпляр SService, sInstance еще не инициализирован. Если вы хотите передать sInstance конструктору какого-либо другого класса из класса A, вам придется сделать это после того, как sInstance присвоено значение, как метод, который вызывается после того, как A полностью сконструирован.
Редактировать:
Пытаюсь кое-что прояснить из комментариев ниже:
class A {
String sInstance
String app
String dbInstance
void anyMethod() {
// this will work as long as you have initialized sInstance
SService s = new SService(sInstance:sInstance, app:app)
}
}
В зависимости от того, что вы действительно пытаетесь сделать, может быть, что-то в этом направлении:
class A {
String sInstance
String app
String dbInstance
SService s
void initializeS() {
if(s == null) {
// this will work as long as you have initialized sInstance
s = new SService(sInstance:sInstance, app:app)
}
}
}
Или:
class A {
String sInstance
String app
String dbInstance
SService theService
SService getTheService() {
if(theService == null) {
// this will work as long as you have initialized sInstance
theService = new SService(sInstance:sInstance, app:app)
}
theService
}
def someMethodWhichUsesTheService() {
getTheService().doSomethingToIt()
}
}
Комментарии:
1. Если я использую другой метод (после того, как A полностью сконструирован), у меня нет доступа к нему как к переменной класса. Как я могу создать его как переменную класса?
2. Почему у вас не было бы доступа к нему внутри метода? Любой метод, определенный внутри
A
, имеет доступ ко всем полям и свойствам, определенным вA
.3. Если я выполняю «def startService ()» и помещаю туда вызов инициализации для SService, то в другом методе у меня нет доступа к созданным мной службам. Я получаю следующее сообщение об ошибке Нет такого свойства: s
4. Вы делаете, если объявляете SService как поле в классе. Смотрите мой пример выше, который включает в себя вызываемое поле
theService
.5. См
someMethodWhichUsesTheService
.