关于Java程序的建议

时间:2013-05-06 14:45:03

标签: java

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

我花了一段时间才弄明白,但我最后通过使用公共变量来“欺骗”,以避免传递/引用类之间的对象。

请帮我正确地将物品传回。

这是我的大多数方法的课程,包括插入查找方法。

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

        }
    }
}

谢谢,我感谢帮助!!!!!!

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);

答案 2 :(得分:-1)

嗯,这里有一些建议(根据自己的判断选择复杂性,但强烈推荐所有这些):

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


通常,您可以达到的解耦水平越高,您的计划就越好。

Single Responsibility Principle 指出:“每个班级都应该承担一项责任,而且责任应该由班级完全封装”。对于方法也是如此:它们应该只有一个明确定义的任务,没有任何副作用。