Java instanceof 解决方案

3

我在Android项目中工作,目前需要为所有视图创建持有者。目前存在很多if语句,我想摆脱它们。假设所有视图都有持有者。

 if (v instanceof Spinner)
    {
        holder = new SpinnerHolder(v);
    }
    else if (v instanceof AdapterView)
    {
        holder = new AdapterViewHolder((AdapterView) v);
    }
    else if (v instanceof CompoundButton)
    {
        holder = new CompoundButtonHolder(v);
    }
    else if (v instanceof EditText)
    {
        holder = new TextViewHolder(v);
    }
    else if (v instanceof SeekBar)
    {
        holder = new SeekBarHolder(v);
    }
    else if (v instanceof TabHost)
    {
        holder = new TabHostHolder(v);
    }

我可以做类似的事情。
String simpleName = v.getClass().getSimpleName();
Class.forName("com.myproject.myholderpackage" + simpleName + "Holder");
...

但是,如果存在自定义视图,例如

public class foo extends LinearLayout
{
}
public class bar extends foo
{
}

感谢您的选择。

一个 Map<Class, String> 或者 Map<Class, Class> 能解决你的问题吗? - user1781290
1个回答

4
我会创建一个映射表:Map<Class,Class> instanceToHolder,然后用一次调用该映射表和一些反射代码来运行构造函数代替那个 if-else 结构。因此,代码大致如下:
final Map<Class,Class> instanceToHolder = new HashMap<Class,Class>();
instanceToHolder.put(Spinner.class, SpinnerHolder.class);
// ....
Class holderClass = instanceToHolder.get(v.getClass());
Object holderObject = holderClass.getConstructor(v.getClass()).newInstance(v);

谢谢!它解决了我的问题。 - Heisenberg
很高兴听到并乐意提供帮助! :) - ZeroOne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接