Kotlin -> object声明和object表达式

核心区别总结

特性 object声明(具名单例) object表达式(匿名对象)
实例数量 ✅ 单例(全局唯一) ❌ 每次创建新实例
声明位置 顶层或类内部) 表达式位置
生命周期 应用级 局部作用域
使用场景 全局配置、工具类、策略常量 临时实现、回调、局部定制

详细对比代码

1. 具名单例对象 - 全局声明

kotlin 复制代码
object ImmediateStart : StartStrategy {
    override operator fun invoke(block: suspend () -> Unit) {
        println("ImmediateStart: ${this.hashCode()}")
    }
}

2. 匿名对象表达式 - 局部创建

kotlin 复制代码
class TestClass {
    fun testDifference() {
        val anonymous1 = object : StartStrategy {
            override operator fun invoke(block: suspend () -> Unit) {
                println("Anonymous1: ${this.hashCode()}")
            }
        }
        
        val anonymous2 = object : StartStrategy {
            override operator fun invoke(block: suspend () -> Unit) {
                println("Anonymous2: ${this.hashCode()}")
            }
        }
        
        // 验证实例数量
        val singleton1 = ImmediateStart
        val singleton2 = ImmediateStart
        
        println("=== 单例对象测试 ===")
        println("singleton1 === singleton2: ${singleton1 === singleton2}")  // true
        singleton1 { }  // 输出相同hashCode
        singleton2 { }  // 输出相同hashCode
        
        println("\n=== 匿名对象测试 ===")
        println("anonymous1 === anonymous2: ${anonymous1 === anonymous2}")  // false
        anonymous1 { }  // 输出不同hashCode
        anonymous2 { }  // 输出不同hashCode
    }
}

字节码层面的区别

object声明编译后

kotlin 复制代码
public final class ImmediateStart implements StartStrategy {
    public static final ImmediateStart INSTANCE = new ImmediateStart();
    private ImmediateStart() {}  // 私有构造函数,确保单例
    // ...
}

object表达式编译后

java 复制代码
// 每次调用都会生成类似这样的代码:
new StartStrategy() {  // 每次new一个新实例
    @Override
    public Object invoke(Function0 block) {
        // ...
    }
}

实际应用场景对比

kotlin 复制代码
class NetworkManager {
    
    // 场景1: 全局策略配置 - 使用object声明
    companion object {
        val DEFAULT_STRATEGY = ImmediateStart  // 全局共享同一个实例
    }
    
    // 场景2: 临时策略定制 - 使用object表达式
    fun createCustomStrategy(delay: Long): StartStrategy {
        return object : StartStrategy {  // 每次调用创建新实例
            override operator fun invoke(block: suspend () -> Unit) {
                GlobalScope.launch {
                    delay(delay)
                    block()
                }
            }
        }
    }
    
    fun demonstrateUsage() {
        // 单例使用
        val strategy1 = DEFAULT_STRATEGY
        val strategy2 = DEFAULT_STRATEGY
        println("Same instance: ${strategy1 === strategy2}")  // true
        
        // 匿名对象使用
        val custom1 = createCustomStrategy(1000)
        val custom2 = createCustomStrategy(1000)
        println("Different instances: ${custom1 === custom2}")  // false
    }
}

内存和性能影响

kotlin 复制代码
class PerformanceTest {
    
    fun testMemoryUsage() {
        // 单例对象 - 内存友好
        repeat(1000) {
            val strategy = ImmediateStart  // 始终引用同一个实例
            // 没有额外内存分配
        }
        
        // 匿名对象 - 可能造成内存压力
        repeat(1000) {
            val strategy = object : StartStrategy {  // 每次创建新对象
                override operator fun invoke(block: suspend () -> Unit) {}
            }
            // 创建了1000个不同的对象实例
        }
    }
}
相关推荐
蛋蛋的就会顺顺的8 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
朱涛的自习室8 小时前
70 美金的 Beyond Compare,我让 Gemini 4 和 DeepSeek 造个开源免费版(Day 2)
android·前端·人工智能
需要8268 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡8 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
死磕音视频9 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
伯恩bourne10 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_10 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs11 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲11 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog11 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友