Dart 对象与 Java、Kotlin 的区别对比
Dart vs Java vs Kotlin 对象模型比较
1. 类定义与构造函数
Java:
java
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Kotlin:
kotlin
class Person(val name: String, val age: Int) {
// 次级构造函数
constructor(name: String) : this(name, 0)
}
Dart:
dart
class Person {
final String name;
final int age;
Person(this.name, this.age); // 主要构造函数
// 命名构造函数
Person.unnamed() : this('Unknown', 0);
}
2. 空安全
Java : 无内置空安全,需手动检查或使用注解(@Nullable
, @NonNull
)
Kotlin:
kotlin
var nonNullable: String = "hello" // 非空
var nullable: String? = null // 可空
Dart:
dart
String nonNullable = 'hello'; // 非空
String? nullable = null; // 可空
3. 数据类/值对象
Java : 需要手动实现equals()
, hashCode()
, toString()
Kotlin:
kotlin
data class Person(val name: String, val age: Int) // 自动生成上述方法
Dart : 没有专门的数据类语法,需要手动实现或使用equatable
包
dart
class Person {
final String name;
final int age;
Person(this.name, this.age);
@override
bool operator ==(Object other) => /* 手动实现 */;
@override
int get hashCode => /* 手动实现 */;
}
4. 扩展函数/方法
Java: 不支持
Kotlin:
kotlin
fun String.addExclamation() = "$this!"
Dart:
dart
extension StringExtension on String {
String addExclamation() => "$this!";
}
5. 接口与实现
Java : 明确区分interface
和class
Kotlin: 类似Java但有更简洁的语法
kotlin
interface Animal {
fun makeSound()
}
class Dog : Animal {
override fun makeSound() { println("Woof!") }
}
Dart: 所有类都隐式定义接口
dart
abstract class Animal {
void makeSound();
}
class Dog implements Animal {
@override
void makeSound() { print("Woof!"); }
}
6. 属性访问
Java: 需要显式的getter/setter方法
Kotlin:
kotlin
class Person(var name: String) // 自动生成getter/setter
Dart:
dart
class Person {
String _name;
String get name => _name;
set name(String value) => _name = value;
// 或者更简洁的语法
String name;
Person(this.name);
}
7. 对象操作
Kotlin:
kotlin
val person = Person("Alice").apply {
age = 30
}
Dart:
dart
var person = Person('Alice')..age = 30; // 级联操作符
8. 伴生对象/静态成员
Java:
java
class MyClass {
public static final String CONSTANT = "value";
}
Kotlin:
kotlin
class MyClass {
companion object {
const val CONSTANT = "value"
}
}
Dart:
dart
class MyClass {
static const String CONSTANT = "value";
}
9. 密封类/代数数据类型
Kotlin:
kotlin
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
}
Dart (使用第三方包或手动实现):
dart
abstract class Result {}
class Success extends Result { final String data; Success(this.data); }
class Error extends Result { final String message; Error(this.message); }
10. 函数式特性
Kotlin:
kotlin
val list = listOf(1, 2, 3)
.map { it * 2 }
.filter { it > 2 }
Dart:
dart
var list = [1, 2, 3]
.map((e) => e * 2)
.where((e) => e > 2)
.toList();
11. 协程/异步处理
Kotlin:
kotlin
suspend fun fetchData(): String {
delay(1000)
return "Data"
}
Dart:
dart
Future<String> fetchData() async {
await Future.delayed(Duration(seconds: 1));
return "Data";
}
总结差异
特性 | Java | Kotlin | Dart |
---|---|---|---|
空安全 | 无 | 有(编译时) | 有(健全的空安全) |
数据类 | 手动实现 | data class 语法 |
需手动实现或使用包 |
扩展方法 | 不支持 | 支持 | 支持 |
接口 | 明确interface |
类似Java但有更简洁语法 | 所有类都隐式定义接口 |
构造函数 | 传统方式 | 主/次级构造函数 | 主/命名构造函数 |
异步编程 | Future /回调 |
协程(suspend ) |
async /await |
函数式编程 | Stream API | 丰富的集合操作 | 类似但略少于Kotlin |
操作符重载 | 不支持 | 支持 | 支持 |
混入(Mixins) | 不支持 | 通过接口默认方法模拟 | 原生支持 |
Dart在语法上比Java更现代简洁,但相比Kotlin缺少一些高级特性(如数据类、密封类)。Kotlin在JVM生态中提供了最完整的现代语言特性,而Dart则更专注于Flutter生态的UI开发需求。