В настоящее время я переношу код Java RMI в Kotlin. Унаследованный интерфейс в Java:
interface Foo: Remote { Bar getBar() throws RemoteException }
После запуска средства автоматической миграции bar
полей будет изменена на свойство:
interface Foo: Remote { val bar: Bar }
Тем не менее, в перенесенной программе getBar
больше не помечен как throws RemoteException
, что приводит к возникновению ошибки illegal remote method encountered
при вызове RMI.
Мне было интересно, есть ли способ отметить @Throws
для свойства?
Ну, если вы посмотрите на @Throws
:
Если есть конкретный геттер, который не использует поле поддержки, просто аннотируйте его напрямую:
val bar: Bar @Throws(RemoteException::class) get() = doSomething()
Допустимыми целями для @Throws
являются
AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER, AnnotationTarget.PROPERTY_SETTER, AnnotationTarget.CONSTRUCTOR
Таким образом, в других случаях вам нужно настроить таргетинг на получателя, а не на свойство:
@get:Throws(RemoteException::class)
Полный список поддерживаемых целей использования :
- файл;
- свойство (аннотации с этой целью не видны Java);
- поле;
- get (свойство getter);
- set (set setter);
- приемник (параметр приемника функции расширения или свойства);
- param (параметр конструктора);
- setparam (параметр настройки свойств);
- делегат (поле, в котором хранится экземпляр делегата для делегированного свойства).
@get
указывает, что эта аннотация будет применена к получателю.
Полный интерфейс
interface Foo: Remote { @get:Throws(RemoteException::class) val bar: Bar }
Вот проблема, хотя – в сгенерированном коде не генерируется предложение throw. Я чувствую, что это может быть ошибкой, поскольку аннотация четко обозначена как таргетинг на эти четыре места использования. CONSTRUCTOR
и FUNCTION
определенно работают, это просто свойства, которые не созданы.
Я взглянул на компилятор Kotlin, пытаясь найти возможную причину, и я нашел это :
interface ReplStateFacade : Remote { @Throws(RemoteException::class) fun getId(): Int ... }
Что интересно избегает свойств, чтобы использовать @Throws
. Может быть, это известное обходное решение?