面试题答案
一键面试提高代码安全性、可维护性及解耦的原则
- 安全性:将不必要暴露的代码设置为较低的可见性,避免外部误操作或恶意访问。
- 可维护性:清晰的可见性设置使代码结构更清晰,易于理解和修改。
- 解耦:限制模块间不必要的依赖,通过合适的接口和有限的可见性来交互。
Kotlin可见性修饰符说明
- private:成员仅在声明它的文件或类内部可见。
- protected:与
private
类似,但在子类中也可见。 - internal:成员在同一模块内可见。模块指的是一组一起编译的 Kotlin 文件,例如一个Gradle 模块。
- public:默认修饰符,成员在任何地方都可见。
不同层次应用示例
- 视图层(以MVVM为例的View部分)
- 布局文件绑定函数:如果某些函数只用于布局文件中的数据绑定,可设为
private
。例如:
- 布局文件绑定函数:如果某些函数只用于布局文件中的数据绑定,可设为
class MainActivity : AppCompatActivity() {
private fun updateUI() {
// 仅用于更新界面,不需要外部访问
}
}
- **视图模型引用**:如果视图层持有视图模型的引用,且不需要外部直接访问这个引用,可设为`internal`。例如:
internal lateinit var viewModel: MainViewModel
- 业务逻辑层(MVVM中的ViewModel部分)
- 私有业务逻辑:对于一些不希望被外部调用的具体业务实现逻辑,设为
private
。例如:
- 私有业务逻辑:对于一些不希望被外部调用的具体业务实现逻辑,设为
class MainViewModel : ViewModel() {
private fun calculateSum(a: Int, b: Int): Int {
return a + b
}
}
- **暴露给视图层的状态和方法**:为了与视图层交互,需要将一些状态和方法设为`public`。例如:
class MainViewModel : ViewModel() {
val data = MutableLiveData<String>()
fun fetchData() {
// 从数据层获取数据并更新data
}
}
- 数据层
- 数据库操作细节:如果使用Room数据库等进行数据持久化,数据库操作的具体实现方法设为
private
。例如:
- 数据库操作细节:如果使用Room数据库等进行数据持久化,数据库操作的具体实现方法设为
class UserDatabase : RoomDatabase() {
private fun insertUser(user: User) {
// 具体的插入逻辑
}
}
- **对外提供的数据访问接口**:为业务逻辑层提供数据访问的接口设为`public`或`internal`。例如:
interface UserDataSource {
fun getUsers(): List<User>
}
如果数据层模块只供本应用模块内使用,可将UserDataSource
接口设为internal
,否则设为public
。