Kotlin 当我需要对参数执行操作时,如何使用辅助构造函数

Kotlin 当我需要对参数执行操作时,如何使用辅助构造函数,kotlin,constructor,Kotlin,Constructor,我有这个类(提供了一个有理数的实现),我在编写第二个构造函数时遇到了问题-我需要对作为参数传递的value:String进行一些计算,我不知道如何编写它 这就是我现在所拥有的,而且有效。大多数情况下。失败的情况是当分母为1时字符串不包含“/”aka data class Rational(val num:BigInteger, val den: BigInteger){ private val numerator private val denominator init{

我有这个类(提供了一个有理数的实现),我在编写第二个构造函数时遇到了问题-我需要对作为参数传递的value:String进行一些计算,我不知道如何编写它

这就是我现在所拥有的,而且有效。大多数情况下。失败的情况是当分母为1时字符串不包含“/”aka

data class Rational(val num:BigInteger, val den: BigInteger){
   private val numerator
   private val denominator
   init{
       denominator = when (den){
           0.toBigInteger -> thrown IllegalArgumentException()
           else -> den
       }
       numerator = num
   }
   constructor (value: String) :
        this(value.split("/")[0].toBigInteger(), value.split("/")[1].toBigInteger())
}

如何修复它?

为什么它必须是构造函数而不是工厂方法?即使这样,您也可以将逻辑提取到帮助器中(由于需要两个值,所以稍微复杂一些):

数据类Rational(val-num:biginger,val-den:biginger){
...
私有构造函数(pair:pair):这个(pair.first,pair.second)
构造函数(值:字符串):
此(解析字符串(值))
伴星{
私有字符串(值:字符串)=
if(value.contains(“/”){
val parts=value.split(“/”)
配对(部件[0]。Tobiginger(),部件[1]。Tobiginger())
}否则
对(value.tobiginger(),1.tobiginger())
}
}

为什么它必须是构造函数而不是工厂方法?即使这样,您也可以将逻辑提取到帮助器中(由于需要两个值,所以稍微复杂一些):

数据类Rational(val-num:biginger,val-den:biginger){
...
私有构造函数(pair:pair):这个(pair.first,pair.second)
构造函数(值:字符串):
此(解析字符串(值))
伴星{
私有字符串(值:字符串)=
if(value.contains(“/”){
val parts=value.split(“/”)
配对(部件[0]。Tobiginger(),部件[1]。Tobiginger())
}否则
对(value.tobiginger(),1.tobiginger())
}
}

这是个好主意!我来试试这个。这是个好主意!我试试这个
data class Rational(val num:BigInteger, val den: BigInteger){ 
   ...
   private constructor (pair: Pair<BigInteger, BigInteger>) : this(pair.first, pair.second)
   constructor (value: String) :
        this(parseString(value))

   companion object {
      private fun parseString(value: String) =
         if (value.contains("/")) {
             val parts = value.split("/")
             Pair(parts[0].toBigInteger(), parts[1].toBigInteger())
         } else
             Pair(value.toBigInteger(), 1.toBigInteger())
   }
}