java - 如何优化只有类发生变化的重复代码?

标签 java android class reflection enums

我有一个基本的 Java 问题困扰了我很长一段时间。考虑以下示例:

ArrayAdapter<CarDetailsAdapter.OwnerType> ownerTypeArrayAdapter = new ArrayAdapter<CarDetailsAdapter.OwnerType>(
                CarDetailsActivity.this, android.R.layout.simple_spinner_dropdown_item, CarDetailsAdapter.OwnerType.values());
        ownerSpinner.setAdapter(ownerTypeArrayAdapter);
        ownerSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                owner_result = Integer.toString(((CarDetailsAdapter.OwnerType) ownerSpinner.getSelectedItem()).value);
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });

        ArrayAdapter<CarDetailsAdapter.DriverType> driver_type = new ArrayAdapter<CarDetailsAdapter.DriverType> (
        CarDetailsActivity.this, android.R.layout.simple_spinner_dropdown_item, CarDetailsAdapter.DriverType.values());
        driverSpinner.setAdapter(driver_type);
        driverSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                driver_result = Integer.toString(((CarDetailsAdapter.DriverType) driverSpinner.getSelectedItem()).value);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

上面的代码可以解释如下:

1 - 创建类型为 OwnerType/DriverType 的 ArrayAdapter(迭代器),这是两个不同的枚举 2 - 将适配器连接到旋转器
3 - 当在微调器中选择一个值时(基于 onItemSelected 监听器)根据变量更新结果

虽然代码是特定于 Android 的,但我认为基础知识也可以扩展到 Java。

除了输入类(枚举),即 CarDetailsAdapter.OwnerType 和 CarDetailsAdapter.DriverType 之外,这两个代码 fragment 几乎完全相同。

有什么方法可以将此功能转换为函数,这样我就不必重复相同的代码行了吗?我已经尝试了数小时的反射(reflection),希望它能解决问题,但我想我遗漏了一些东西。

谢谢

最佳答案

像这样的东西可以工作:

interface Callback<T> {
    void complete(T result);
}

public <T> void spinner(int spinnerId, Class<? extends Enum> enumClass, final Callback<T> callback) {

    final Spinner spinner = (Spinner) getActivity().findViewById(spinnerId);
    ArrayAdapter<Enum> arrayAdapter = new ArrayAdapter<Enum>(
            getActivity(), android.R.layout.simple_spinner_dropdown_item, enumClass.getEnumConstants());
    spinner.setAdapter(arrayAdapter);
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            T result = (T) spinner.getSelectedItem();
            callback.complete(result);
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {

        }
    });
}

// ....

spinner(R.id.ownerSpinner, CarDetailsAdapter.OwnerType.class, new Callback<CarDetailsAdapter.OwnerType>() {
        @Override
        public void complete(CarDetailsAdapter.OwnerType result) {
            owner_result = result;
        }     
    });

您可能还想归还微调器或以其他方式进行调整。

关于java - 如何优化只有类发生变化的重复代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34748946/

相关文章:

java - 我的简单二维数组存在问题

Android:隐藏设备的音量变化条?

java - 如果用户手动终止应用程序,则从离开的位置恢复 Activity

python - 无法使用 whileloop 创建对象(python)

c# struct vs 类性能,设计重点

Java 结合自定义比较器使用比较器

java - 如何使用Cloud Anchor和Sceneform构建ARCore多人游戏?

java - StringType 问题 : Exception in thread "main" scala. MatchError : org. apache.spark.sql.types.StringType@

android - 为什么通过 ViewDataBinding 访问 ViewStub 时 Android Studio 构建失败?

c++ - 为方法提供一个空实例是一种好习惯吗?