【问题标题】:Scope and lifetime of ListList 的作用域和生命周期
【发布时间】:2013-08-12 11:51:45
【问题描述】:

我有一个静态的产品列表类型。当我从 Shopowner 类填充此列表时,它工作正常,但是当我编译 Customer.java 时,列表返回空白集。为什么填充的列表没有保留?

class Products {

    String name;
    int itemcode;
    Products(){}
    static List <Products> list = new ArrayList<Products>();
    Products(String name,int itemcode)
      {  
        this.name=name;
        this.itemcode=itemcode;
      }
    public String toString()
    {return (name+""+itemcode);}        
}

class Shopowner {       
  public static void main (String ...at)

{
        Products o = new Products("Shamppo",12);    
        Products.list.add(o);
        Products o1 = new Products("choco",1112);   
        Products.list.add(o1);
           System.out.println(Products.list); //prints fine
}
    }

 class Customer {
                public static void main (String args[])
            {       
           System.out.println(Products.list);   //prints [] 
           }    
}

OutPut(编译 Customer.jav 时)

  [] 

【问题讨论】:

  • 回复:Products(String c){c=itemname;} 该声明没有任何作用。成员 itemname 仍将是 null。你想在那里做什么?也许你的意思是this.itemname = c;
  • 对不起!那是错字,已更正。
  • 代码只是一团糟。你能正确格式化吗?

标签: java list generics arraylist


【解决方案1】:

请参阅下面的部分代码:

public static void main (String ...a)
{
Products o= new Products("Chocolate"); 
o.addToList();
Products o1= new Products("Icecream");
o1.addToList();
new Products().showList(); //This line is the culprit

您在对象 o 和 o1 中添加列表,并且您在完全不同的对象上调用 showList() new Products().showList();?

注意: 它适用于静态列表,因为它在您的 Product 类的所有对象之间共享,而非静态列表并非如此。

【讨论】:

  • 如何从客户类中检索此列表而不在此类中添加任何内容。我可以在产品类中创建一个静态块并将它们放入其中。任何其他想法。
  • 您的上述观点不清楚,您正在考虑将列表设为静态?
  • 是的,我正在尝试将此列表设为静态。现在我创建了另一个类 Customer { new Products().showList() //Prints [] } 如何在此处检索已填充的列表
  • 那么很简单 products.list 会返回客户类中的列表。
  • @Malwaregeek 如果您的问题得到解决,请接受答案。
【解决方案2】:

问题是您通过创建新产品并在其上调用 showList 来创建新列表。如果您想要特定产品的列表,那么您应该在正确的对象上调用该方法。静态为每个实例维护一个变量,因此它在静态时可以工作。

【讨论】:

  • 静态列表应该在项目的整个生命周期中保留?
  • @Malwaregeek 是的,完全正确。静态对象将在整个运行过程中保持其生命周期。
【解决方案3】:

首先,编译一个类不会给你你提到的结果。您不仅在编译 Customer.java,而且还在执行 Customer 中的 main 方法。

在我看来,您有 2 种主要方法,一种在 Customer 中,另一种在 Shopowner 中。您期望在运行 Customer#main() 时,您会看到 Shopowner#main() 中填充的内容。然而,这根本不合理:如果您运行 Shopowner#main(),它是您另一次运行 Customer#main() 的另一个过程。静态变量不会跨越不同的进程。

我相信你应该对编程有一些基本的了解。您的代码中有很多设计问题需要修复,但与上面提到的问题相比,它们变得微不足道....

【讨论】:

  • 好的,如果我将填充列表代码放在参数化构造函数中并从客户类调用它,它应该可以正常工作。 new Shopowner("添加产品");或者,我可以创建一个单独的零售类,而不是为店主和客户创建单独的类,使用 switch 语句我可以添加将产品添加为 shpowner 或作为客户购买产品的功能。
  • 那么你到底在问什么?我不确定这是否是我的问题......我根本不知道你试图表达什么。
  • 确保您知道自己在问什么,并以其他人可以理解的方式提问。这与初学者无关。有很多初学者问得很好
  • 好的 :) 我问的是你所指的设计问题。您能否在回答中详细说明。
  • 1.您的问题是询问“静态变量的变化不可见”的问题。如果您想谈论另一个话题,请提出另一个问题。 2. 这样的设计问题是主观的,Stack Overflow 可能不适合讨论这个问题。清理您的问题并检查是否适合在 codereview.stackexchange.com 中提问
猜你喜欢
  • 2011-07-15
  • 2011-08-06
  • 2011-12-29
  • 1970-01-01
  • 2020-09-09
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
相关资源
最近更新 更多