有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java是否可以将Kotlin的bydelegation用于现有的类/对象(即Arrow的)?

我有几个专门的类,我想用Kotlin和Arrow创建,它们将围绕一个Arrow或monad。我创建了下面的代码来使用Kotlin的委托,但我想知道它是否可以简化或变得更地道。如有任何建议,将不胜感激

感谢您的时间和兴趣

internal data class EitherWrapper<L,R>(private var delegate: Either<L,R>) {
     internal operator fun getValue(thisRef: Any?, property: KProperty<*>): Either<L,R> {
        return delegate
    }

    internal operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Either<L,R>) {
        delegate = value
    }
}

fun main(args: Array<String>) {
    val delegate: Either<Exception, String> = Right("howdy")
    val myeither: Either<Exception, String> by EitherWrapper(delegate)
    println("IsLeft(): ${myeither.isLeft()}")
    println("IsRight(): ${myeither.isRight()}")
}

共 (2) 个答案

  1. # 1 楼答案

    所以,我想我有一个解决问题的办法。下面的代码将一个“任意”封装在一个新类型中:Exception。这段代码是我想要构建的起点。最终,我会有如下内容:

    enter image description here

    我可以通过后端服务传递这种类型的实例,并返回更精确的异常、错误或值

    interface EitherMonad<L, R> {
        val either: Either<L, R>
    }
    
    class BaseEitherMonad<L, R>(
        override val either: Either<L, R>
    ) : EitherMonad<L, R>
    
    class Exceptional<R>(
        private val delegate: EitherMonad<Exception, R>
    ) : EitherMonad<Exception, R> by delegate {}
    
    fun main() {
    
        val delegateRight = BaseEitherMonad<Exception, String>(Either.Right("howdy"))
        val exceptionalRight = Exceptional(delegateRight)
        println("IsLeft(): ${exceptionalRight.either.isLeft()}")
        println("IsRight(): ${exceptionalRight.either.isRight()}")
        exceptionalRight.either.fold({ throw it }, { println("Right: $it") })
        exceptionalRight.either.map { println(it) }
    
        val delegateLeft = BaseEitherMonad<Exception, String>(Either.Left(IllegalStateException("Boom!")))
        val exceptionalLeft = Exceptional(delegateLeft)
        println("IsLeft(): ${exceptionalLeft.either.isLeft()}")
        println("IsRight(): ${exceptionalLeft.either.isRight()}")
        exceptionalLeft.either.fold({ throw it }, { println("Right: $it") })
        exceptionalLeft.either.map { println(it) }
    }
    

    跑步: enter image description here

  2. # 2 楼答案

    您的代码是正确的,据我所知,您唯一能做的改进是使其通用,而不是具体,如下所示:

    internal data class DelegateWrapper<T>(private var delegate: T) {
      internal operator fun getValue(thisRef: Any?, property: KProperty<*>): T = 
        delegate
    
      internal operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
        delegate = value
      }
    }