【问题标题】:Java instanceof workaround [duplicate]Java instanceof解决方法[重复]
【发布时间】:2013-12-03 10:05:12
【问题描述】:

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

 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> 能解决您的问题吗?

标签: java android


【解决方案1】:

我会创建一个映射:Map<Class,Class> instanceToHolder,然后将 else-if 构造替换为对该映射的一次调用和一些反射代码来运行构造函数。所以,是这样的:

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);

【讨论】:

  • 谢谢!它解决了我的问题。
  • 很高兴听到并乐于提供帮助! :)
猜你喜欢
  • 2016-04-02
  • 1970-01-01
  • 2012-07-24
  • 2019-11-18
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
相关资源
最近更新 更多