You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin类间共享变量:实现接口的方式是否合理及更优方案

嘿,你的当前实现完全达不到让两个类共享同一个money变量的需求哦,我来给你拆解问题并提供几个靠谱的方案:

先说说现有代码的问题

你现在的MainActivity和ShopActivity各自重写了money变量,这意味着每个类的实例都拥有独立的money副本——比如你在MainActivity里修改money的值,ShopActivity里的money还是原来的0,完全做不到值一致,所以当前实现是不合理的。

方案1:用单例类管理共享状态(简单直接,适合小型项目)

创建一个单例类来持有共享的money变量,然后让接口委托给这个单例,这样所有实现接口的类都会共用同一个变量:

// 单例类,专门管理共享的资金状态
object SharedWallet {
    var money: Int = 0
}

// 修改接口,让money的取值和赋值都委托给单例
interface myVariables {
    // 只读的money,方便直接获取
    val money: Int
        get() = SharedWallet.money
    // 可修改的入口,用于更新资金
    var mutableMoney: Int
        get() = SharedWallet.money
        set(value) { SharedWallet.money = value }
}

// 实现类无需再重写money,直接继承接口即可
class MainActivity : myVariables, AppCompatActivity() {
    // 示例:修改共享资金
    fun earnMoney() {
        mutableMoney += 50
    }
}

abstract class ShopActivity : myVariables, AppCompatActivity() {
    // 示例:查看共享资金
    fun showBalance() {
        println("当前余额:$money")
    }
}

这样不管是MainActivity还是ShopActivity的实例,操作的都是SharedWallet里的同一个money变量,自然能保持值一致。

方案2:依赖注入(解耦性强,适合中大型项目)

如果你的项目已经使用了依赖注入框架(比如Hilt),可以把共享的钱包类做成单例依赖,注入到两个Activity中,这种方式更利于测试和扩展:

// 钱包类,标记为单例(以Hilt为例)
@Singleton
class Wallet @Inject constructor() {
    var money: Int = 0
}

// 简化接口,或者直接在Activity中注入Wallet
interface myVariables {
    val wallet: Wallet
}

// MainActivity中注入Wallet
class MainActivity : AppCompatActivity(), myVariables {
    @Inject lateinit var wallet: Wallet

    fun spendMoney() {
        wallet.money -= 20
    }
}

abstract class ShopActivity : AppCompatActivity(), myVariables {
    @Inject lateinit var wallet: Wallet

    fun checkBalance() {
        println("当前余额:${wallet.money}")
    }
}

这种方式把共享状态和Activity解耦,后续如果需要修改资金的管理逻辑,只需要调整Wallet类即可,还能在测试时替换为模拟的Wallet实例。

方案3:接口伴生对象(不推荐,灵活性差)

虽然可以用接口的伴生对象实现共享,但这种方式是全局静态的,不利于后续扩展和测试,仅适合非常简单的场景:

interface myVariables {
    companion object {
        var money: Int = 0
    }
}

class MainActivity : myVariables, AppCompatActivity() {
    fun updateMoney() {
        myVariables.money = 100
    }
}

abstract class ShopActivity : myVariables, AppCompatActivity() {
    fun printMoney() {
        println(myVariables.money) // 会输出100
    }
}

总结

如果是小型项目,优先选方案1;如果是中大型项目且已经用了DI框架,选方案2;方案3尽量避免使用,因为它的扩展性太差。

内容的提问来源于stack exchange,提问作者Tad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:42:48