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
相关产品推荐
相关产品推荐

