你可以在java中使用单例作为子类

时间:2012-10-19 16:41:08

标签: java singleton subclass

如何在子类中使用单例模式?例如,在下面的代码中,itemCatalog扩展了item。我想使用类项的getPrice getter

public class ItemCatalog extends Item{

   private static ItemCatalog instance = new ItemCatalog(); 
   private Item itemCatalog[] = new Item[9];


   private ItemCatalog(){
   }

   public static ItemCatalog getInstance(){
      return instance;
   }

   public void populateCatalog(){  
      itemCatalog[0] = new Item("bb","Baked Beans",35);
      itemCatalog[1] = new Item("cf","Cornflakes",100);
      itemCatalog[2] = new Item("s0","Sugar",50);
      itemCatalog[3] = new Item("tb","Tea Bags",115);
      itemCatalog[4] = new Item("ic","Instant Coffee",250);
      itemCatalog[5] = new Item("b0","Bread",50);
      itemCatalog[6] = new Item("s0","Sausages",130);
      itemCatalog[7] = new Item("e0","Eggs",75);
      itemCatalog[8] = new Item("m0","Milk",65);
    }

   public void searchCatalog(String itemCode){  

      for (int i = 0; i < itemCatalog.length; i++){
          if (itemCode.equals(itemCatalog[i].getItemCode())){
             price = itemCatalog[i].getItemprice();
             break;
          }
      }   
   }

编辑2:我希望将此类作为单例和子类的子类,而不是单例。

当我在构造函数中放置super(String itemCode,String description,int price)时出现错误

编辑3:好的我想我用这些代码解决了这个问题。我是java.stilling练习和学习的新手:) ...感谢大家的见解

private ItemCatalog() {

    }
   private ItemCatalog(String itemCode,String description, int price){
       super(itemCode,description, price);
   }

编辑4:我不确定这是否正确但是想在类项目中使用getPrice方法返回searchcatalog的结果,这是一个价格。这是正确的设计吗?

3 个答案:

答案 0 :(得分:1)

为什么要将它作为子类?子类通常是专门化的(Vehicle - &gt; Car,Bus或Pet - &gt; Cat,Dog)。子类的实例继承其父类的所有字段和方法。我看到你的Item类有一些ID,名称和价格。因此,您的ItemCatalog实例也有ID,名称和价格。我知道你想要的是一个单身人士,但我没有看到它成为Item的子类的原因。你能解释一下这个设计决定的原因吗?

答案 1 :(得分:0)

我不确定问题是什么,但是......

如果您创建实例字段final,则不需要synchronized getInstance()

如果静态字段是final,则引用以线程安全的方式初始化,并且不能更改,因此您不需要锁定任何内容来访问它。

答案 2 :(得分:0)

您的设计需要改变。目录需要与项目分开。