несколько экземпляров атрибута члена суперкласса - PullRequest
0 голосов
/ 22 марта 2019

У меня есть абстрактный класс-заглушка, который должен быть подклассом для добавления аннотаций пружины.

abstract class ConsumerStub<TYPE>{

    val receivedMessages: MutableMap<String, TYPE> = ConcurrentHashMap()

    open fun processMessage(@Payload payload: TYPE, record: ConsumerRecord<String, *>) {
        this.receivedMessages[record.key()] = payload
    }

    fun receivedMessageWithKey(key: String): Boolean = this.receivedMessages.contains(key)

    fun receivedMessageWithKeyCallable(key: String): Callable<Boolean> = Callable { receivedMessageWithKey(key) }

    fun getReceiveMessageWithKey(key: String): TYPE? = this.receivedMessages[key]

    fun reset() {
        this.receivedMessages.clear()
    }
}

, например:

open class WorkflowRequestConsumerStub: ConsumerStub<InternalWorkflowRequest>() {

    @KafkaListener(
        id = "xyzRequestConsumerStub",
        topics = ["abc-workflow-requests"]
    )
    override fun processMessage(
        @Payload payload: InternalWorkflowRequest,
        record: ConsumerRecord<String, *>
    ) {
        super.processMessage(payload, record)
    }

}

Я вижу действительно странное поведение с receiveMessages,После некоторой отладки, которую я понял, кажется, что есть 2 экземпляра receiveMessages.

stub.reset () выдает исключение нулевого указателя

после изменения кода для инициализации receiveMessages в reset (), processMessage () и receiveMessageWithKey () видят 2 разных ReceiveMessages с разными objectIds.

что происходит?В java у подкласса должен быть доступ ко всем защищенным членам в super, поэтому я предполагаю, что то же самое относится и к kotlin.

UPDATE: это работает, как и ожидалось, при определении абстрактных и переопределенных параметроввляемых сообщений в реализациях.Это действительно отстой, если это так, как это должно быть сделано в kotlin.В этом случае для реализации нет необходимости заботиться о карте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...