Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java类对象的重用_Java - Fatal编程技术网

Java类对象的重用

Java类对象的重用,java,Java,我的课程顺序如下所示: public class Order { private List<OrderLine> orderLines = new ArrayList<OrderLine>(); public void add(OrderLine o) throws Exception { if (o == null) { System.err.println("ERROR - Order is NULL");

我的课程顺序如下所示:

public class Order {

    private List<OrderLine> orderLines = new ArrayList<OrderLine>();


    public void add(OrderLine o) throws Exception {
        if (o == null) {
            System.err.println("ERROR - Order is NULL");

        }
        orderLines.add(o);
    }
    public void clear() {
      this.orderLines.clear();

    }
}
公共类秩序{
private List orderLines=new ArrayList();
公共作废添加(订单行o)引发异常{
如果(o==null){
System.err.println(“错误-顺序为空”);
}
订单行。添加(o);
}
公共空间清除(){
this.orderLines.clear();
}
}
现在,在我的主要部分中,我想使用order和updatelist的一个变量,并打印输出

我的主类代码:

 public static void main(String[] args) throws Exception {

        Map<String, Order> allOrders = new HashMap<String, Order>();

        //Build Order 1
        Order order = new Order();
        order.add(new OrderLine(new Item("book", (float) 12.49), 1));
        order.add(new OrderLine(new Item("Pen", (float) 14.99), 1));

        allOrders.put("Order 1", order);
        order.clear();



        //Build Order 2

        // Reuse cart for an other order


        order.add(new OrderLine(new Item("imported box of chocolate", 10), 1));
        order.add(new OrderLine(new Item("perfume", (float) 47.50), 1));
        allOrders.put("Order 2", order);
        order.clear();
}
publicstaticvoidmain(字符串[]args)引发异常{
Map allOrders=new HashMap();
//建造顺序1
订单=新订单();
订单。添加(新订单行(新项目(“账簿”,(浮动)12.49),1);
添加(新订单行(新项目(“笔”,“浮动”)14.99),1);
配售(订单1,订单);
顺序。清除();
//建造订单2
//将购物车重新用于其他订单
添加(新订单行(新项目(“进口巧克力盒”,10),1));
订单。添加(新订单行(新项目(“香水”),(浮动)47.50),1);
配售(订单2,订单);
顺序。清除();
}
这里我创建了一个order对象,添加了详细信息,并将其添加到列表中。现在清除对象中的数据并使用新的order详细信息更新对象,但第一个order详细信息也使用第二个order详细信息更新。我认为order对象是按引用传递的。如何实现对象重用,避免按引用传递,并且所有订单详情

问候,,
Nagasree.

如果多次将相同的
顺序
实例添加到
映射
中,则
映射
中的所有值都将相同

不要调用
clear()
,而是创建一个新的
订单

替换

order.clear();

如果没有将单个对象添加到
映射
,那么使用重用单个对象的范例是有意义的

例如,您可以使用单个
StringBuilder
实例生成将添加到
映射中的
字符串

Map<Integer,String> map = new HashMap<>();
StringBuilder sb = new StringBuilder(128);
sb.append("one");
map.put(1,sb.toString());

sb.setLength(0); // equivalent to your clear()
sb.append("two"); // reuse same StringBuilder instance
map.put(2,sb.toString());
Map Map=newhashmap();
StringBuilder sb=新的StringBuilder(128);
某人附加(“一”);
map.put(1,sb.toString());
sb.设置长度(0);//相当于你的clear()
某人附加(“两个”);//重用相同的StringBuilder实例
map.put(2,sb.toString());

如果多次将相同的
订单
实例添加到
映射
中,则
映射
中的所有值都将相同

不要调用
clear()
,而是创建一个新的
订单

替换

order.clear();

如果没有将单个对象添加到
映射
,那么使用重用单个对象的范例是有意义的

例如,您可以使用单个
StringBuilder
实例生成将添加到
映射中的
字符串

Map<Integer,String> map = new HashMap<>();
StringBuilder sb = new StringBuilder(128);
sb.append("one");
map.put(1,sb.toString());

sb.setLength(0); // equivalent to your clear()
sb.append("two"); // reuse same StringBuilder instance
map.put(2,sb.toString());
Map Map=newhashmap();
StringBuilder sb=新的StringBuilder(128);
某人附加(“一”);
map.put(1,sb.toString());
sb.设置长度(0);//相当于你的clear()
某人附加(“两个”);//重用相同的StringBuilder实例
map.put(2,sb.toString());
您需要类似

或者干脆这样做:

order = new Order ();
你需要像这样的东西

或者干脆这样做:

order = new Order ();
  • 您可以为订单创建一个对象

  • 将此对象放入列表中

  • 您可以编辑同一对象

  • 您(重新)将同一对象放入列表中

->您的列表包含相同对象的2倍

事实上:

使用新订单详细信息更新对象

应该是

使用另一个订单详细信息更新对象

  • 您可以为订单创建一个对象

  • 将此对象放入列表中

  • 您可以编辑同一对象

  • 您(重新)将同一对象放入列表中

->您的列表包含相同对象的2倍

事实上:

使用新订单详细信息更新对象

应该是

使用另一个订单详细信息更新对象


Java的可能副本是,并且总是按值传递。我不相信你对你的答案做了足够的研究,问题很简单,Java可能是重复的,而且总是按值传递。我不相信你对你的答案做了足够的研究,问题很简单Singleton与你的第二个建议正好相反Singleton与你的第二个建议正好相反实际上的挑战不是创建另一个有序的对象并实现它。我想可能是我缺少了java的一些概念。@NAGASREE如果你必须在
Map
,不能使用单个
Order
对象。如果只想打印这些订单表示的数据,可以使用单个
Order
实例,但将其放入
Map
Order.toString()
(假设您的订单类覆盖
toString())
。谢谢你的解释。实际上,挑战不是创建另一个有序的对象并实现它。我想可能是我缺少了java的一些概念。@NAGASREE如果你必须在
映射
中放置
顺序
实例一个值,你不能使用单个
顺序
对象。如果你只想打印所表示的数据通过这些订单,您可以使用单个
Order
实例,但要放入
Map
Order.toString()
(假设您的订单类覆盖了
toString()
),谢谢您的解释。