169 похожих чатов

Когда делаю что-то вроде этого, IDE выдает warning: Can be

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

Это баг тулинга идеи или языка?

13 ответов

54 просмотра

Я бы порекомендовал переписать конструкторы класса по-котлиновски, а не по джавовски. Размер кода уменьшится на две трети, и понятнее все сразу станет.

По-моему в документации это не плохо прописано: https://kotlinlang.org/docs/classes.html#inheritance Котлину приятнее использовать ,,праймари,, конструкторы (совмещённые с именем класса) и сразу параметрами из них определять свойства, либо можно использовать init {} (но как мне уже тут говорили, init редко используется и применяется обычно прямое присвоение - именно как сработал автофикс)

Dmitry-Stakhov Автор вопроса
Jan 𝑓𝑛
По-моему в документации это не плохо прописано: h...

Мы бы не хотели использовать праймари конструктор, так как так тяжелее понять кто что вызывает. Поэтому решили сделать два явных конструктора. Разумеется, если есть идеи как улучшить читабельность, всегда открыты к предложениям 😅

Dmitry Stakhov
Мы бы не хотели использовать праймари конструктор,...

сделать пустой праймари приватным и дергать его из других конструкторов (но тогда вероятно придется сделать lateinit свойства), или жинерик для типов наследуемых от number, или оставить один от Float и потом при создании конвертировать параметры к Float😄

Dmitry Stakhov
Мы бы не хотели использовать праймари конструктор,...

Чтобы улучшить читаемость, как говорили выше, лучше один primary constructor с двумя override val, и один дополнительный конструктор, вызывающий primary. Это стандарт.

Dmitry Stakhov
Мы бы не хотели использовать праймари конструктор,...

по факту у вас праймари остался) просто он сделан в виде тела, а идея просто говорит "можно проще", можно поставить сапрез на этот варнинг

Dmitry-Stakhov Автор вопроса
Bohdan Panchenko
по факту у вас праймари остался) просто он сделан ...

Понятно что можно игнорировать проблемы, но это не мой путь) То что идея говорит можно проще и ломает код не есть хорошо по моему мнению

Dmitry Stakhov
Понятно что можно игнорировать проблемы, но это не...

почему ? ві против инспекций ? оно не должно ломать код, оно заменяет на еквивалент

Dmitry-Stakhov Автор вопроса
Bohdan Panchenko
почему ? ві против инспекций ? оно не должно ломат...

Если эквивалент не компилируется, я думаю проблема не в том я за или против

Dmitry-Stakhov Автор вопроса

После того как применяю контекстную подсказку, то почеркивает красным и даёт ошибку компиляции. Я сказал это в первом сообщении

а не увидел во что рефакторить, такое себе читать, должна упростить

Dmitry Stakhov
После того как применяю контекстную подсказку, то ...

а оно еще не компилируется - явно репортить нужно

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта