如何将Kotlin Fragment的by lazy ViewModel初始化转为Java实现
简洁规范地将Kotlin Fragment重写为Java版本(ViewModel初始化实现)
核心实现思路
Kotlin中用by lazy实现的ViewModel懒加载,在Java中可以通过延迟初始化+主线程安全的方式简洁实现,避免字节码工具生成的冗余代码。以下是完整的规范实现:
import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.EditText; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; public class AddDataFragmentJava extends Fragment { // 延迟初始化ViewModel,对应Kotlin的by lazy private DetailViewModel viewModel; // 获取ViewModel的方法,简洁实现懒加载 private DetailViewModel getViewModel() { if (viewModel == null) { viewModel = new ViewModelProvider(this).get(DetailViewModel.class); } return viewModel; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_add_data_java, container, false); // 获取视图控件 Button button = v.findViewById(R.id.buttonSaveData); EditText editTextNumber2 = v.findViewById(R.id.editTextNumber2); EditText editSetNumber = v.findViewById(R.id.editSetNumber); button.setOnClickListener(v1 -> { // 获取输入值(添加格式异常处理,避免崩溃) double weightNumber; int setNumber; try { weightNumber = Double.parseDouble(editTextNumber2.getText().toString()); setNumber = Integer.parseInt(editSetNumber.getText().toString()); } catch (NumberFormatException e) { // 可在此添加输入错误提示逻辑 return; } // 调用ViewModel方法,直接通过getViewModel()获取实例 getViewModel().saveWeather( new Weather( new City("M", 51.5, weightNumber), setNumber, 1 ) ); }); return v; } }
关键细节说明
- ViewModel懒加载:
getViewModel()方法在首次调用时初始化ViewModel,后续直接返回已创建的实例,和Kotlin的by lazy行为完全一致。由于Fragment的生命周期方法均在主线程执行,无需额外加synchronized锁,大幅简化代码。 - 输入健壮性处理:添加了
NumberFormatException捕获,避免用户输入非数字内容导致崩溃,补全了原Kotlin代码的健壮性缺失。 - 视图操作规范:在
onCreateView中一次性获取所需控件,避免后续重复查找,符合Java Fragment的常规开发习惯。
内容的提问来源于stack exchange,提问作者Павел К
相关产品推荐
相关产品推荐

