joined with assignment
class Rectangle : Shape {
override val width: Float
override val height: Float
constructor(width: Float, height: Float) {
this.width = width
this.height = height
}
constructor(width: Int, height: Int) : this(
width = width.toFloat(),
height = height.toFloat(),
)
}
Но когда пользуюсь контекстной подсказкой Idea рефакторит во что-то такое, что пишет ошибку компиляции
class Rectangle : Shape {
override val width: Float = width
override val height: Float = height
constructor(width: Float, height: Float)
constructor(width: Int, height: Int) : this(
width = width.toFloat(),
height = height.toFloat(),
)
}
Это баг тулинга идеи или языка?
Я бы порекомендовал переписать конструкторы класса по-котлиновски, а не по джавовски. Размер кода уменьшится на две трети, и понятнее все сразу станет.
По-моему в документации это не плохо прописано: https://kotlinlang.org/docs/classes.html#inheritance Котлину приятнее использовать ,,праймари,, конструкторы (совмещённые с именем класса) и сразу параметрами из них определять свойства, либо можно использовать init {} (но как мне уже тут говорили, init редко используется и применяется обычно прямое присвоение - именно как сработал автофикс)
Мы бы не хотели использовать праймари конструктор, так как так тяжелее понять кто что вызывает. Поэтому решили сделать два явных конструктора. Разумеется, если есть идеи как улучшить читабельность, всегда открыты к предложениям 😅
сделать пустой праймари приватным и дергать его из других конструкторов (но тогда вероятно придется сделать lateinit свойства), или жинерик для типов наследуемых от number, или оставить один от Float и потом при создании конвертировать параметры к Float😄
Чтобы улучшить читаемость, как говорили выше, лучше один primary constructor с двумя override val, и один дополнительный конструктор, вызывающий primary. Это стандарт.
по факту у вас праймари остался) просто он сделан в виде тела, а идея просто говорит "можно проще", можно поставить сапрез на этот варнинг
Понятно что можно игнорировать проблемы, но это не мой путь) То что идея говорит можно проще и ломает код не есть хорошо по моему мнению
почему ? ві против инспекций ? оно не должно ломать код, оно заменяет на еквивалент
Если эквивалент не компилируется, я думаю проблема не в том я за или против
а вот тут по подробней
После того как применяю контекстную подсказку, то почеркивает красным и даёт ошибку компиляции. Я сказал это в первом сообщении
а не увидел во что рефакторить, такое себе читать, должна упростить
а оно еще не компилируется - явно репортить нужно
Обсуждают сегодня