Как использовать вторичные конструкторы, когда мне нужно сделать операции над параметром - PullRequest
1 голос
/ 25 сентября 2019

У меня есть этот класс (обеспечивает реализацию для рационального числа), и у меня возникают проблемы при написании вторичного конструктора - мне нужно сделать некоторые вычисления для значения: строка, которую я передаю в качестве параметра, и я не знаю, какнаписать это.

Это то, что у меня сейчас, и это работает.Большинство случаев.Случай, который терпит неудачу, - то, когда строка не содержит "/" иначе, когда знаменатель равен 1.

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())
}

Как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

возможно, вы можете использовать функцию поиска для "/" перед использованием value.split ("/")

0 голосов
/ 25 сентября 2019

Почему это должен быть конструктор, а не фабричный метод?И даже если это произойдет, вы можете извлечь логику в помощник (с небольшим усложнением, потому что вам нужно два значения):

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())
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...