Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何优化只有类更改的重复代码?_Java_Android_Class_Reflection_Enums - Fatal编程技术网

Java 如何优化只有类更改的重复代码?

Java 如何优化只有类更改的重复代码?,java,android,class,reflection,enums,Java,Android,Class,Reflection,Enums,我有一个关于Java的基本问题,这个问题困扰了我很长一段时间。考虑下面的例子: ArrayAdapter<CarDetailsAdapter.OwnerType> ownerTypeArrayAdapter = new ArrayAdapter<CarDetailsAdapter.OwnerType>( CarDetailsActivity.this, android.R.layout.simple_spinner_dropdown_ite

我有一个关于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) {

            }
        });
ArrayAdapter所有者类型ArrayAdapter=新的ArrayAdapter(
CarDetailsActivity.this,android.R.layout.simple_微调器_下拉菜单_项,CarDetailsAdapter.OwnerType.values();
ownerSpinner.setAdapter(ownerTypeArrayAdapter);
ownerSpinner.setOnItemSelectedListener(新AdapterView.OnItemSelectedListener()){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
owner_result=Integer.toString(((CarDetailsAdapter.OwnerType)ownerSpinner.getSelectedItem()).value);
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
ArrayAdapter驱动程序类型=新的ArrayAdapter(
CarDetailsActivity.this,android.R.layout.simple_微调器_下拉菜单_项,CarDetailsAdapter.DriverType.values();
driverSpinner.setAdapter(驱动程序类型);
driverSpinner.setOnItemSelectedListener(新的AdapterView.OnItemSelectedListener(){
@凌驾
已选择公共视图(AdapterView父视图、视图视图、整型位置、长id){
driver_result=Integer.toString(((CarDetailsAdapter.DriverType)driverSpinner.getSelectedItem()).value);
}
@凌驾
未选择公共无效(AdapterView父级){
}
});
上述代码可解释如下:

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

虽然代码是针对Android的,但我认为基本原理也可以扩展到Java

除了输入类(Enum)即
CarDetailsAdapter.OwnerType&CarDetailsAdapter.DriverType
,这两个代码段实际上是相同的

有没有办法将这个功能转换成一个函数,这样我就不必重复相同的代码行了?我已经尝试了几个小时的反思,希望它能解决问题,但我认为我遗漏了一些东西


谢谢

像这样的方法可能会奏效:

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;
        }     
    });
接口回调{
无效完成(T结果);
}

公共空间旋转器(int spinnerId,class2)这两个类是否实现了一个公共接口?听起来像是泛型的例子。目前还没有,但我可以制作它们。是否有某种方式我也可以抽象侦听器部分,因为这两个代码段之间的部分也是相同的?我更新了代码,我认为这应该会给出您想要的。是的,这是simil我最终也实现了这一目标。谢谢