【问题标题】:How do i access a specific object from with in the class it was created from如何从创建它的类中访问特定对象
【发布时间】:2014-09-20 17:37:20
【问题描述】:

我不会将我的整个代码粘贴到这里来解决我的问题。为了简单起见,我只是在这里为我的问题编写一些代码。

好的,我有一个名为“exampleClass”的类,它有一个名为“number”的整数变量,例如,“number”有一个 get 和 set 方法。我的问题是:如果我有多个“exampleClass”对象,我如何从多个对象中获取特定对象,以便我可以从“exampleClass”内部访问该特定对象。

下面的“exampleClass”

   public class exampleClass{

    public int number;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
}

【问题讨论】:

  • `如果我在不同的类中有多个“exampleClass”对象,我如何从“exampleClass”中的多个对象中获取特定对象,以便我可以从“exampleClass”中访问该特定对象“。`请澄清,因为它没有意义:)
  • 您的问题有点含糊,但您可能想使用HashMap<Integer,ExampleClass>,假设每个对象都有不同的数字并且您知道这些数字是什么。

标签: java android oop


【解决方案1】:

假设数字是使您的类的任何实例“唯一”进行比较的原因,您应该考虑覆盖 equals 和 hashCode 方法。

这样,您将能够使用 indexOf(Object o); 在 ArrayList 等集合中找到您的类的实例;

例如:

public class ExampleClass
{
    private int number;

    public ExampleClass(int number)
    {
        this.number = number;
    }

    public int getNumber()
    {
        return number;
    }

    public void setNumber(int number)
    {
        this.number = number;
    }

    @Override
    public boolean equals(Object other)
    {
        boolean isEqual = false;

        if (other instanceof ExampleClass)
        {
            ExampleClass otherEC = (ExampleClass)other;

            isEqual = number == otherEC.number;
        }

        return isEqual;
    }

    @Override
    public int hashCode()
    {
        return number;
    }
}

public static void main(String[] args)
{
    List<ExampleClass> list = new ArrayList<ExampleClass>();

    ExampleClass ec1 = new ExampleClass(1);

    list.add(ec1);
    list.add(new ExampleClass(3));
    list.add(new ExampleClass(102));

    System.out.println(list.indexOf(new ExampleClass(3)));
    System.out.println(list.indexOf(new ExampleClass(1)));
    System.out.println(list.indexOf(ec1));
    System.out.println(list.indexOf(new ExampleClass(5)));

}

将产生以下输出:

1
0
0
-1

请在此处查看有关为什么要为要存储在集合中的对象覆盖 equals 和 hashCode 的更多信息:

Why do I need to override the equals and hashCode methods in Java?

【讨论】:

    【解决方案2】:

    这是你想要达到的目标吗?

    import java.util.HashMap;
    
    public class Test {
        public static void main(String[] args) {
            new ExampleClass(123);
            new ExampleClass(456);
    
            ExampleClass obj1 = ExampleClass.getInstance(123);
            ExampleClass obj2 = ExampleClass.getInstance(456);
            ExampleClass obj3 = ExampleClass.getInstance(789);
    
            System.out.println(obj1); //Output: ExampleClass-object with ID 123
            System.out.println(obj2); //Output: ExampleClass-object with ID 456
            System.out.println(obj3); //Output: null
        }
    }
    class ExampleClass {
        private static final HashMap<Integer, ExampleClass> instances
                = new HashMap<Integer, ExampleClass>();
    
        private final int id;
    
        public ExampleClass(int id) {
            if(instances.get(id) != null)
                throw new IllegalArgumentException("An instance with ID " + id
                        + " already exists.");
            this.id = id;
            instances.put(id, this);
        }
        public int getID() {
            return id;
        }
        public static ExampleClass getInstance(int id) {
            return instances.get(id);
        }
        @Override
        public String toString() {
            return this.getClass().getSimpleName() + "-object with ID " + id;
        }
    }
    

    请注意,在上面的示例中,创建两个具有相同 ID 的ExampleClass-objects 将引发异常。

    【讨论】:

      【解决方案3】:

      您需要为您创建的每个对象关联一个唯一标识符。在不更改类结构的情况下最接近的方法是使用哈希码。但是在这种情况下不能保证对象的唯一性。 所以下一个选项是更改类的结构(这是个坏主意)并向类添加一个 UUID。创建对象时初始化 UUID(构造函数)。现在要跟踪对象,您可以使用 HashMap。

      【讨论】:

        猜你喜欢
        • 2013-10-06
        • 2014-12-15
        • 1970-01-01
        • 2018-04-13
        • 2016-07-11
        • 2016-03-24
        • 1970-01-01
        • 1970-01-01
        • 2015-01-02
        相关资源
        最近更新 更多