Java 如何优化只有类更改的重复代码?
我有一个关于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
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我最终也实现了这一目标。谢谢