Можно ли иметь параметры макроаннотации (и как их получить)?
У меня есть некоторый источник данных, который требует операций переноса в транзакциях, которые имеют 2 возможных результата: успех и неудача. Этот подход вводит довольно много стандартного кода. То, что я хотел бы сделать, это что-то вроде этого (то же самое относится и к сбоям (что-то вроде @txFailure
может быть)):
@txSuccess(dataSource)
def writeData(data: Data*) {
dataSource.write(data)
}
куда @txSuccess
это макрос аннотации, которая после обработки приведет к следующему:
def writeData(data: Data*) {
val tx = dataSource.openTransaction()
dataSource.write(data)
tx.success()
tx.close()
}
Как видите, этот подход может оказаться весьма полезным, так как в этом примере 75% кода может быть удалено из-за того, что он является образцом.
Это возможно? Если да, можете ли вы подтолкнуть меня в правильном направлении? Если нет, что вы можете порекомендовать, чтобы добиться чего-то подобного?
1 ответ
Это определенно возможно, но вам не обязательно нужны макросы для этой задачи.
Вот простое решение, которое не использует макросы
object DataOperation {
def withTransation[T](dataSource: DataSource)(f: () => T): T = {
val tx = dataSource.openTransation()
f()
tx.success()
tx.close()
}
}
И используйте это как
DataOperation.withTransation(dataSource) {
dataSource.write(data)
}