Java instanceof 解决方法

标签 java android

<分区>

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

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

但是它不起作用,例如,如果有像这样的自定义 View

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

谢谢。

最佳答案

我会创建一个 map :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);

关于Java instanceof 解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20348061/

相关文章:

java - 共享音频按钮

java - JAXB:使用缩进编码输出 XML 在第一行创建空换行符

java - 在 eclipse 中找不到带有 Appium 的构造函数 AndroidDriver

Android:发送数据短信时出现问题

java - 无法为指定的 SELECT 语句定义 SENSITIVE 游标 "SQL_CURSH200C1"。 SQLCODE=-243,SQLSTATE=36001,DRIVER=4.13.127

java - 如何在 hibernate 实体中按多列定义索引?

java - 有没有一种工具可以查看我的 Java 代码,并建议一个好的包结构?

android - 如何将Eclipse项目推送到Github

Android:允许 TableLayout 中的边距/填充以在小部件之间进行一些分隔

Android AsyncTask 在多次互联网下载时崩溃