【问题标题】:Get instance variable by its name通过名称获取实例变量
【发布时间】:2014-06-15 07:45:09
【问题描述】:

我有两个班级,A 和 B。

B 包含 A 的实例。我想按名称从 B 返回 A 的实例:

class A
{
    public String name;

    public A (String name)
    {
        this.name = name;
    }
}

class B
{
    public A a1;
    public A a2;
    public A a3;

    public B ()
    {
        this.a1 = new A ("a1");
        this.a2 = new A ("a2");
        this.a3 = new A ("a3");
    }

    public A get_A_byName (String name)
    {
        // Is it possible to write something like this? B will always contain only instances of A
        for (A a : B.variables)
        {
            if (a.name.equals(name))
            {
                return a;
            }

            // Or in case A doesn't have a variable "name", can I get an A instance by its declared name in B?
            if (a.getClass().getName().equals(name))
            {
                return a;
            }
        }
    }
}

是否可以做代码的 cmets 中描述的事情?提前致谢。

【问题讨论】:

  • 为什么不使用简单的ifelse 呢? if(a1.name.equals(name)) else if(a2.name.equals(name) ...
  • 你应该看看适当的收藏。例如,使用 HashMap 很容易实现这一点。比拥有一长串 if-else 要好得多。
  • 如果您一心要迭代,即使是一个简单的数组也能支持这一点。
  • 使用反射可以实现这一点 - 但 kviiri 指出了一个更简单的选择。
  • @user1928742:不排除 also 使用哈希映射来提供您需要的名称解析。

标签: java instance instance-variables


【解决方案1】:

这或多或少是哈希图的用途,用于将键(在本例中为字符串)与对象配对

class B
{
    private HashMap<String,A> theAs=new HashMap<String,A>(); //give better name


    public B ()
    {
        theAs.put("a1",new A ("a1")); //A probably doesn't need to keep its own name internally now, but have left it as its in your original code
        theAs.put("a2",new A ("a2"));
        theAs.put("a3",new A ("a3"));
    }

    public A get_A_byName (String name)
    {
        return theAs.get(name);
    }
}

注意事项

  • 在 Java 7+ 中,您不需要添加第二个 &lt;String,A&gt;,菱形 推理会做,所以在 Java 7 或更高版本中它会是:

    private HashMap<String,A> theAs=new HashMap<>();
    

【讨论】:

  • 我不使用 HashMap 的原因是我希望 B 中的 A 实例可以通过点直接访问,例如B.a1 |但似乎我还需要实现那个 HashMap。谢谢
  • @user1928742 作为一般规则,您不希望字段可以直接访问(非常简单的“类似结构”的对象除外)。你松散了封装,bug 悄悄潜入
猜你喜欢
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 2011-01-03
  • 1970-01-01
  • 2019-05-13
  • 2013-03-30
相关资源
最近更新 更多