Grails инициализация классов

#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 .