如何移除Kotlin数据类中字符串字段的空白字符?
Kotlin Data Class 实现字段自动去空格
我有个在多场景复用的Data Class:
data class Person( val name: String, val lastName: String )
想确保name和lastName永远不含空白字符(比如用replace(" ", "")清理),但直接在字段声明里调用replace的写法行不通:
// 这种写法无法编译 data class Person( val name: String.replace(" ", ""), val lastName: String.replace(" ", "") )
下面是几种可行的实现方式:
1. 重载构造函数处理参数
直接在重载构造函数里对入参做清理,再传给主构造:
data class Person( val name: String, val lastName: String ) { // 重载构造函数,接收原始字符串并处理后传给主构造 constructor(rawName: String, rawLastName: String) : this( rawName.replace(" ", ""), rawLastName.replace(" ", "") ) }
- 优点:调用方不用额外处理,传进来的字符串自动被清理
- 注意:调用
copy()时如果传入新参数,也会被自动清理(因为copy本质是调用构造函数)
2. 用工厂方法封装创建逻辑
把构造函数私有化,通过伴生对象的工厂方法创建实例,确保所有入参都被处理:
data class Person private constructor( val name: String, val lastName: String ) { companion object { fun of(name: String, lastName: String) = Person( name.replace(" ", ""), lastName.replace(" ", "") ) } } // 调用方式:Person.of("John ", " Doe")
- 优点:强制所有实例都通过工厂方法创建,从根源避免未处理的字符串
- 缺点:调用方式从
Person(...)变成Person.of(...),需要调整现有代码
3. 隐藏原始字段,通过getter返回处理后的值
保留原始未处理的私有字段,对外暴露的属性在getter里返回清理后的值:
data class Person( private val rawName: String, private val rawLastName: String ) { val name: String get() = rawName.replace(" ", "") val lastName: String get() = rawLastName.replace(" ", "") }
- 优点:原始值被保留,需要的时候可以直接用;每次获取属性都会重新处理(适合原始值可能动态变化的场景)
- 缺点:如果原始值不变,每次get都会重复调用
replace,有轻微性能损耗
4. 自定义属性委托(适合复用场景)
如果多个类都需要字段去空格的逻辑,可以写一个通用的属性委托:
// 只读属性的委托 class NoWhitespace(private val rawValue: String) { operator fun getValue(thisRef: Any?, property: KProperty<*>): String { return rawValue.replace(" ", "") } } // 简化委托创建的函数 fun noWhitespace(value: String) = NoWhitespace(value) // 使用委托的Data Class data class Person( private val rawName: String, private val rawLastName: String ) { val name: String by noWhitespace(rawName) val lastName: String by noWhitespace(rawLastName) }
- 优点:逻辑可复用,其他类需要去空格的字段直接用这个委托就行
- 缺点:需要额外写委托类,稍微增加了代码量
内容的提问来源于stack exchange,提问作者Targetbus12
相关产品推荐
相关产品推荐

