16

我的 java 项目要求我创建一个对象(项目)数组,填充项目数组,然后创建一个主方法,要求用户输入返回相应项目的项目代码。

我花了一段时间才弄清楚,但我最终通过使用公共变量来“作弊”以避免在类之间传递/引用对象。

请帮助我正确地将对象传回。

这是我的大多数方法的类,包括insertfind方法。

public class Catalog {
    private Item[] itemlist;
    private int size;
    private int nextInsert;
    public Item queriedItem;

    public Catalog (int max) {

        itemlist = new Item[max];
        size = 0;
    }
    public void insert (Item item) {
        itemlist[nextInsert] = item;
        ++nextInsert;
        ++size;
    }
    public Item find (int key) {
        queriedItem = null;

        for (int posn = 0; posn < size; ++posn) {
            if (itemlist[posn].getKey() == key) queriedItem = itemlist[posn];
        }{
            return queriedItem;
        }
    }
}

这是我的主要课程:

import java.util.*;

public class Program {
    public static void main (String[] args) {

        Scanner kbd = new Scanner (System.in);
        Catalog store;
        int key = 1;

        store = new Catalog (8);
        store.insert(new Item(10, "food", 2.00));
        store.insert(new Item(20, "drink", 1.00));



        while (key != 0) {

            System.out.printf("Item number  (0 to quit) ?%n");
            key = kbd.nextInt();
            if (key == 0) {
                System.out.printf("Exiting program now!");
                System.exit(0);
            }

            store.find(key);

            if (store.queriedItem != null) {
                store.queriedItem.print();
            }
            else System.out.printf("No Item found for %d%n", key);

        }
    }
}

谢谢我的帮助!!!!!!!

4

3 回答 3

11

store.find(key);返回一个Item你应该使用它并从中删除公共字段Catalog

public Item find (int key) {
   Item queriedItem = null;
   //....
}

Item searched = store.find(key);

if (searched != null)
   searched.print();
else 
   System.out.printf("No Item    found for %d%n", key);
于 2013-05-06T14:50:39.270 回答
9

完全删除您的使用,queriedItem只需从以下位置返回项目find:替换

        store.find(key);

    if (store.queriedItem != null){store.queriedItem.print();}else System.out.printf("No Item found for %d%n", key);

Item foundItem = store.find(key);
if (foundItem != null) {
   foundItem.print();
} else System.out.printf("No Item found for %d%n", key);
于 2013-05-06T14:51:22.673 回答
-1

好吧,这里有一些建议(您可以自行决定选择复杂性,但强烈推荐所有这些建议):

  • 研究属性,例如这里。或 XML。您可以使用配置文件中的值填充数组以获得更大的灵活性。
  • 在您的代码中使用常量作为文字(在必要的地方)。
  • 创建一个 ApplicationFactory 为您初始化整个应用程序。像这样的事情需要与您的域逻辑分开。
  • 创建一个UserInputProvider界面,以便您可以轻松更改读取用户输入的方式,而不会影响其他任何内容。例如,用一个ConsoleInputProvider类来实现它。
  • 一般来说,尝试对不是纯领域对象的所有事物使用接口(在这里,您可能只有一个Item)。
  • 尽量让你的方法尽可能简短。与其在一个方法中做很多事情,不如让它调用适当命名的其他方法(分组相关逻辑)来告诉它正在做什么。
  • 如果您不允许作弊和使用Listor Map,请设计您自己的实现,将数据结构和处理与表示的逻辑分开Catalog(即Catalog反过来将委托给,例如,Map.get或您的数据结构实现的等效方法)
  • 您的 main 基本上应该只有 ApplicationFactory(或 IoC 框架)来构建和初始化您的应用程序,调用UserInputProvider(它不应该知道它正在使用的确切实现)来获取用户输入,根据需要验证和转换数据,调用Catalog来查找适当的Item然后(类似于输入接口)将结果(它得到的确切数据,不是一些字符串或类似的)发送到SearchResultView决定如何显示这个结果的接口的某个实现(在这种情况下它将是一个控制台-基于实现,它打印一个代表Item它得到的字符串)。


一般来说,你能达到的解耦水平越高,你的程序就会越好。

单一职责原则指出: “每个类都应该有一个单一的职责,并且该职责应该完全由类封装”。方法也是如此:它们应该有一个且只有一个定义明确的任务,没有任何副作用。

于 2013-05-06T15:30:07.403 回答