[外文翻译]《Effective Java》在哪些方面影响了 Ko(2)

要用Java实例化一个对象,就得这样:

final JavaNutritionFacts cocaCola = new JavaNutritionFacts.Builder(240,8) .calories(100) .sodium(35) .carbohydrate(27) .build();

而在Kotlin中,你不再需要使用构造器模式,因为它有默认参数的功能,允许你为每个可选的构造函数参数定义默认值:

class KotlinNutritionFacts( private val servingSize: Int, private val servings: Int, private val calories: Int = 0, private val fat: Int = 0, private val sodium: Int = 0, private val carbohydrates: Int = 0)

所以在Kotlin中创建对象就可以这样:

val cocaCola = KotlinNutritionFacts(240,8, calories = 100, sodium = 35, carbohydrates = 27)

如果想让可读性更强,你也可以把必需的参数命名为 servingSize 和 servings

val cocaCola = KotlinNutritionFacts( servingSize = 240, servings = 8, calories = 100, sodium = 35, carbohydrates = 27)

跟Java一样,这里创建的对象是不可变的。

我们将Java的47行代码减少到了Kotlin的7行,大大提高了生产力。

图0:[外文翻译]《Effective Java》在哪些方面影响了 Kotlin  的设计?

温馨提示:如果想用Java创建这样的 KotlinNutrition 对象当然也是可以做到的,但你得为每个可选参数设定一个值。还好,只要加上 JvmOverloads 注解,那么就会自动生成多个构造器,使用注解时需要 constructor关键字:

class KotlinNutritionFacts @JvmOverloads constructor( private val servingSize: Int, private val servings: Int, private val calories: Int = 0, private val fat: Int = 0, private val sodium: Int = 0, private val carbohydrates: Int = 0)

2. 创建单例(singleton)很容易

Effective Java 的条目3说了如何设计一个单例Java对象,也就是只能实例化一个实例的对象。下面的代码片段展示了一个“单向”的宇宙,其中只能存在一个猫王:

public class JavaElvis { private static JavaElvis instance; private JavaElvis() {} public static JavaElvis getInstance() { if (instance == null) { instance = new JavaElvis(); } return instance; } public void leaveTheBuilding() { } }

Kotlin 有“对象声明”的概念,可以方便的通过对象声明来获得一个单例。

object KotlinElvis { fun leaveTheBuilding() {} }

再也不用费劲构造单例了。

3. 开箱即用的 equals() 和 hashCode()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cc8c7fb36c2398f444afd229c7b5ef12.html