【问题标题】:Java: Get all Objects in ClassJava:获取类中的所有对象
【发布时间】:2012-05-14 17:16:13
【问题描述】:

我有一个如下所示的课程:

public class Items {
    String uselessText;
    public static final Item COW = new Item("text", 0);
    public static final Item CAT = new Item("abc", 1);
    public static final Item DOG= new Item("wow", 2);
        ...SO on

    public void search(String search) {
          for(every Item in this Class) {
              if(item.textString == "abc") {
                 //DO SOMETHING
              }
          }

        }

这可能吗?不,谢谢我不想做一个数组(因为我有超过 100 个项目,我希望它们静态访问)

有什么想法吗?

干杯

【问题讨论】:

  • 一件事是肯定的..你需要将 == 更改为 equals()
  • 这有一种可怕的设计气味......

标签: java class object


【解决方案1】:

如果您可以在编译时列出该类的所有可能实例,use an enum

public enum Items {

    COW("text", 0),
    CAT("abc", 1),
    DOG("wow", 2),
    // ...
    ;

    private final String textString;
    private final int number;

    private Item(String textString, int number) {
        this.textString = textString;
        this.number = number;
    }

    public void search(String search) {
        for(Item : values()) {
            if("abc".equals(item.textString)) {
                //DO SOMETHING
            }
        }
    }
}

【讨论】:

  • 比我的方法要好得多。 +1
  • @VivinPaliath 我不知道它 好多了 - 这取决于 OP 如何使用该类。不过谢谢
  • 我没有注意到他的班级被称为Items,所以如果他想维护一个静态的项目列表,那么enum 似乎在这里更有意义。 :)
  • 太棒了!但是我无法通过键入 MyClass.COW 来访问它们,我是不是正确的?
  • @AndroidXTr3meN 错误。您绝对可以访问它们,就像那样。听起来你应该阅读我添加的the Java tutorial link
【解决方案2】:

为什么不使用List<Item>?您可以将列表设为 static,尽管我不确定您为什么需要将其设为 static

那么你可以这样做:

for(Item item : items) {
    if("abc".equals(item.getTextString())) {
        //Do something
    }
}

请注意,您不能使用== 比较字符串(或任何对象);你必须使用.equals()。对于String,您也可以使用.compareTo()。使用== 时,您只是在比较参考。此外,使用访问器而不是在 Itempublic 上创建 textString 属性。

【讨论】:

    【解决方案3】:

    使用数组或列表。如果您担心对 100 多个项目进行硬编码,那您就错了。从文本文件或其他文件中读取它们。但是,当您想要的是数组或列表的功能时,尝试使用新对象而不是数组或列表,并没有多大意义。

    【讨论】:

      【解决方案4】:

      如果您不愿意使用数组,或者至少不愿意使用可迭代的东西,那么您的工作就会比必要的困难很多。 p>

      例如,这里有一些代码可以使用ArrayList<String> 完成您希望完成的任务:

      public class Items {
          ArrayList<Item> itemSet = new ArrayList<Item>();
          // Code to fill in itemSet - involves itemSet.add(new Item("text", 0)), etc.
      
          public void search(String search) {
              for(Item i: itemSet) { // Enhanced for-loop, iterates over objects
                  if ("abc".equals(i.textString)) {
                      // do something
                  }
              }
          }
      }
      

      对这些对象进行静态访问是没有意义的。如果你想从这个对象返回它,你可以使用一个访问器来返回数组或 ArrayList 到任何需要它的地方。

      【讨论】:

        猜你喜欢
        • 2015-09-10
        • 1970-01-01
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多