java - 在 Kotlin 中处理字段的正确方法是什么?

标签 java kotlin

我应该如何正确处理从带有字段的 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 的样子:

enter image description here

我怎样才能用 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/

相关文章:

java - 使用 @SecondaryTable 注解映射实体 Spring Hibernate

java - 使用java中方法返回的字符串变量

java - 在所有 SpringBeans 和 ApplicationContext 都被初始化之后调用方法

java - 运行应用程序时,Intellij 不包括对类路径的 gradle 依赖

kotlin - okhttp3 moshi-JsonAdapter运行时问题

android - 三星 A10 android 11 如何从我的应用程序以编程方式创建其他应用程序固定快捷方式

java - 更改 JPanel 默认图形

java - 队列没有产生正确的输出

kotlin - Kotlin 代码如何编译为 native 代码?

android - 如何在 Kotlin 中将波斯/阿拉伯数字转换为英文数字?