我应该如何正确处理从带有字段的 Java 类到 Kotlin 的迁移?
阅读 Kotlin 的文档后发现,它们的类中不能定义字段。作为一个叛逆者,我实际上试图将现有的 Java 代码转换为 Kotlin 代码(使用 Android Studio 的 Java 到 Kotlin 转换器功能),并且还用 unpleasantly blinding highlight 标记“字段”。 .
这是我的 Java 类:
public final class PaperDay implements Day {
private Date date;
private Weather weather;
PaperDay() {
// Obligatory empty ctor for Paper.
}
PaperDay(Date date) {
this.date = truncateTimeFromDate(date);
this.weather = Weather.SUNNY; // Default to SUNNY, 'cos sunny is good!
}
PaperDay(Date date, Weather weather) {
this.date = truncateTimeFromDate(date);
this.weather = weather;
}
private Date truncateTimeFromDate(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
...
..这就是转换为 .kt 的样子:
我怎样才能用 Kotlin 的方式做到这一点?
最佳答案
我假设你想要这样的东西:
class PaperDay (private var date: Date,
private var weather: Weather = Weather.SUNNY) : Day {
init {
this.date = truncate(date)
}
private fun truncateTimeFromDate(date1: Date): Date {
return date1
}
}
您应该尽可能尝试使用可选参数(varweather:Weather=Weather.SUNNY
),因为它会大大提高可读性。
为了避免(有点难看)init
block ,您还可以仅传递两个属性之一作为构造函数参数(感谢 Jayson Minard),并通过使用计算其声明中的另一个属性“正常”参数:
class PaperDay (dateWithTime: Date,
private val weather: Weather = Weather.SUNNY): Day {
private val date: Date = truncateTimeFromDate(dateWithTime)
...
}
请注意,这也使用 val
而不是 var
,因为不变性通常是更好的选择。
如果您还需要有空的构造函数,您可以添加它(尽管我认为这不是一个好的做法,并且它是“坏”的指标) 设计:
constructor() : this(Date())
或者,为构造函数中的所有参数添加默认值也会隐式创建一个空构造函数。
如果您确实想要可空性,请使用 ?
定义您的属性。例如:
class PaperDay (private var date: Date?, private var weather: Weather? = Weather.SUNNY)
然后您还可以将另一个构造函数更改为 constructor() : this(null)
此外,恕我直言,将 truncate...
方法添加为 extension function 也是一个好主意。对于 Date 类,而不是将其放在此类中:
fun Date.truncateTimeFromDate() {
Calendar calendar = Calendar.getInstance()
calendar.setTime(this)
calendar.set(Calendar.HOUR_OF_DAY, 0)
calendar.set(Calendar.MINUTE, 0)
...
}
关于java - 在 Kotlin 中处理字段的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35459317/