#spring #kotlin
Вопрос:
Я изменил свой код с этого:
object SomeHelper{}
к этому:
@Component
class SomeHelper(private val anAttribute: AnAttributeService){}
AnAttributeService
выглядит так:
@Service
class AnAttributeService(private val myLoader: MyLoader){}
Это MyLoader
:
interface MyLoader {
fun loadSomething()
}
В моем тестовом классе я написал что-то вроде этого:
class SomeHelperTester{
val cut = SomeHelper
//...
}
раньше это работало нормально, когда SomeHelper был объектом, но теперь, когда я пишу
val cut = SomeHelper(anAttribute = AnAttributeService(myLoader = MyLoader))
MyLoader подчеркнут красным цветом с сообщением об ошибке Classifier MyLoader does not have a companion object, and thus must be initialized
Как я могу заставить эту строку кода работать?
Ответ №1:
после myLoader =
вам нужно предоставить экземпляр type MyLoader
. вы не можете просто сказать MyLoader
там.
Если MyLoader
бы это был класс, на который вы могли бы просто его изменить MyLoader()
. Но вы определили MyLoader
его как интерфейс, что означает, что вам нужно предоставить для него реализацию.
Наиболее распространенный способ сделать это — создать класс, который расширяет интерфейс, и создать его экземпляр. например:
class MyLoaderImp: MyLoader {
override fun loadSomething() {
//implementation here
}
}
затем вы можете сделать
val cut = SomeHelper(anAttribute = AnAttributeService(myLoader = MyLoaderImp()))
также обратите внимание, что в kotlin вам не нужно явно указывать имена параметров, если вы не указываете их в другом порядке или не пропускаете некоторые, так что это также допустимо и короче
val cut = SomeHelper(AnAttributeService(MyLoaderImp()))
в качестве альтернативы вы можете предоставить реализацию в анонимном классе следующим образом
val cut = SomeHelper(AnAttributeService(object: MyLoader{
override fun loadSomething() {
//implementation here
}
}))
Мне кажется, что вам все еще не хватает многих основ о kotlin и программировании в целом. Я предлагаю вам изучить некоторые разделы документации на веб-сайте kotlin, чтобы лучше понять все: