【问题标题】:Why can't I add an element to a list from another class?为什么我不能将元素添加到另一个类的列表中?
【发布时间】:2015-01-29 22:05:15
【问题描述】:

我有两个班级,PizzaPizzaTopping。在Pizza 中是一个ArrayList,它应该存储字符串(披萨配料)。我正在尝试从PizzaTopping 类中的ham 方法向数组中添加一个元素。但是,当我打印列表时,它显示为空。为什么?

这是PizzaTopping:

public class PizzaTopping {

    Pizza p = new Pizza();

    public void ham() {
        double cost = 1;
        System.out.println("im in ham");
        p.addToPizza("ham");
        p.setCost(p.getCost() + cost);
    }
}

这是我的披萨课:

import java.util.ArrayList;
import java.util.Arrays;

public class Pizza {

    private double cost;
    ArrayList<String> pizza = new ArrayList<String>();

    public double getCost() {
        return cost;
    }

    public void setCost(double cost) {
        this.cost = cost;
    }

    public void addToPizza(String x) {
        System.out.println("im in add");
        pizza.add(x);
    }

    public static void main(String [] args) {
        //scanner to add topping
        PizzaTopping pt = new PizzaTopping();
        Pizza p = new Pizza();
        pt.ham();
        System.out.println(Arrays.toString(p.pizza.toArray()));
    }

}

【问题讨论】:

  • '任何想法我做错了什么?' - 没有提到意大利辣香肠。
  • 你的班级协会搞砸了。 PizzaTopping 不应包含 Pizza 的引用。应该反过来。此外,您应该确保PizzaTopping 不在Pizza 对象之间共享。

标签: java arrays list class


【解决方案1】:

只需这样做:

PizzaTopping pt = new PizzaTopping();
pt.ham();
System.out.println(Arrays.toString(pt.p.pizza.toArray()));

问题是您在 main 中创建了一个新的比萨对象,并且没有使用与 pt 绑定的对象,因此 ham 方法将值保存在 pt.p 中而不是 p 中(您在 main 方法中创建的)

【讨论】:

  • 太棒了!谢谢!
  • 如何使用第三类(PizzaBase)也添加到同一个列表中?
  • 这个问题断章取义(对不起),你应该先尝试一下,相信我它真的很简单! :)
  • 我只能让它打印浇头或底座,不能同时打印。除非我把它变成静态的,否则我不想这样做
  • 顺便说一下,尝试学习更多有关 Is-a Has-a 关系的知识,它将帮助您编写更好的面向对象代码,例如 Pizza 类应该包含 PizzaToppings 对象和 PizzaBase 对象,这样我们可以说那Pizza HAS-A PizzaToppings 和PizzaBase,这在技术上是正确的,也许这些东西会帮助你找到你的解决方案:)
【解决方案2】:

你的Pizza 类可能应该有一个默认的或无参数的构造函数来制作奶酪披萨(加一些酱汁)。它应该提供一个.addTopping(PizzaTopping topping) to allow adding topping to it. In theory, there should be an unlimited number of topping that you can add. However, to control the number of toppings, you can probably limit them by adding them to an array (or someCollections` 对象)。

public class Pizza
{
    private List<PizzaTopping> toppings = new ArrayList<PizzaTopping>();

    public Pizza() {} // constructs basic cheese pizza

    public void addTopping(PizzaTopping topping) throws IllegalArgumentException
    {
        if (toppings == null)
            throw new IllegalArgumentException("Topping cannot be null");
        toppings.add(new PizzaTopping(topping.toString());
    }

    @Override
    public String toString()
    {
        return "Pizza with " + toppings.size() + " toppings: " + toppings.toString();
    }
}

PizzaTopping 类可能应该有一个单参数构造函数(字符串)来提供浇头的名称。

public PizzaTopping
{
    private String name;

    public PizzaTopping(String name) throws IllegalArgumentException
    {
        if (name == null)
            throw new IllegalArgumentException("Name cannot be null");
        this.name = name;
    }

    @Override
    public String toString()
    {
        return name;
    }
}

您的测试类应该简单地创建配料、比萨饼,然后将配料添加到比萨饼中。每个类都有一个方便的方法(toString())来打印关于对象的信息。 toppings 打印出它的名字,pizza 打印出 toppings 的数量和 toppings 是什么。 (这是未经测试的代码,但应该可以工作。)

PizzaTopping 的新实例添加到比萨饼的原因是,不应该在不同的Pizza 实例之间共享浇头。此外,您应该确保检查不应允许的空对象。为空对象抛出 IllegalArgumentException 是一种很好的方法,这些非法参数不会使其(或破坏)到您的代码中。

【讨论】:

    猜你喜欢
    • 2020-08-04
    • 1970-01-01
    • 2016-03-18
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    相关资源
    最近更新 更多