2012-02-04 24 views
4

PHPで長年開発した後、私はJavaにステップインすることにしました。快適なOOPの方法論とそのすべてで、私はjavaの中でその時点から始めようとしていますが、Itemクラスのメソッドを使って出力するために、私のarraylistオブジェクトをfor文に渡してしまいます。Javaオブジェクト配列Foreachメソッドへのアクセス

HelloInvetory.java

package helloInventory; 

import java.util.Arrays; 

public class HelloInventory { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     Object InvetoryItems; 

     Inventory inv = new Inventory(); 
     inv.createItemObj(101, "camera", "Used camera that I bought off of a homeless guy.", 500); 
     InvetoryItems = inv.getAllInventoryItems(); 

     for(Object item : InvetoryItems){ 
       System.out.println(item.getItemName()); 
     } 

     System.out.println("Done"); 
    } 

} 

Inventory.java

package helloInventory; 

import java.util.*; 

/** 
* Tracks and maintains all items within the inventory 
* @author levi 
* 
*/ 
public class Inventory { 

    List<Object> InventoryItems = new ArrayList<Object>(); 

    /* 
    * create object from Items class 
    * and insert into Object[] array. 
    */ 
    public void createItemObj(int sku, String name, String descriptor, float price) { 
     Items item = new Items(); 
     item.setSku(sku); 
     item.setItemName(name); 
     item.setItemDescription(descriptor); 
     item.setItemPrice(price); 

     this.setInventoryItems(item); 
    } 
    public Object getAllInventoryItems() { 
     //return InventoryItems; 
     return this.InventoryItems.toArray(); 
    } 

    public void setInventoryItems(Object inventoryItems) { 
     //InventoryItems.add(inventoryItems); 
     this.InventoryItems.add(inventoryItems); 
    } 
} 

Items.java

私はこだわっています
package helloInventory; 
/** 
* Class object to hold each item details 
* @author levi 
* 
*/ 
public class Items { 

    int sku; 
    String itemName; 
    String itemDescription; 
    float itemPrice; 

    public int getSku() { 
     return sku; 
    } 
    public void setSku(int sku) { 
     this.sku = sku; 
    } 
    public String getItemName() { 
     return itemName; 
    } 
    public void setItemName(String itemName) { 
     this.itemName = itemName; 
    } 
    public String getItemDescription() { 
     return itemDescription; 
    } 
    public void setItemDescription(String itemDescription) { 
     this.itemDescription = itemDescription; 
    } 
    public float getItemPrice() { 
     return itemPrice; 
    } 
    public void setItemPrice(float itemPrice) { 
     this.itemPrice = itemPrice; 
    } 

} 

はワットでありますHelloInventory.java

for(Object item : InvetoryItems){ 
       System.out.println(item.getItemName()); 
     } 

IDE(Eclipseの)ithinする「だけの配列またはjava.lang.Iterableのインスタンスを繰り返すことができ、」私にエラーを与えます。何か余計なことがあるのですか、それとも私はJavaでこれをまったく間違った方法で回していますか?正しい例が参考になります。

ベスト、 レヴィ

答えて

7

あなたがここに私の友人を非常に奇妙なアーキテクチャを持っています。どこでも一般的なObjectを使用するべきではなく、実際のタイプです。最初のもの:

public Object getAllInventoryItems() { 
    //return InventoryItems; 
    return this.InventoryItems.toArray(); 
} 

Listを返すのはなぜですか?

public List<Item> getAllInventoryItems() { 
    return this.InventoryItems; 
} 

また、この変更:

List<Item> InventoryItems = new ArrayList<Item>(); 

と、この:今すぐListを反復

public void setInventoryItems(Item inventoryItems) { 
    this.InventoryItems.add(inventoryItems); 
} 

が順風満帆です:ところで

public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    List<Item> InvetoryItems; 

    Inventory inv = new Inventory(); 
    inv.createItemObj(101, "camera", "Used camera that I bought off of a homeless guy.", 500); 
    InvetoryItems = inv.getAllInventoryItems(); 

    for(Item item : InvetoryItems){ 
      System.out.println(item.getItemName()); 
    } 

    System.out.println("Done"); 
} 

、私は変更をItemsItemの習慣がありません。クラス名は単一のエンティティを示すべきであり、慣例により単数である。

これは間違った方法ではありませんが、Javaで間違った足で降りたかもしれないので、私はこの読書を強くお勧めします:http://www.mindview.net/Books/TIJ/これは私がJavaで始まったときに働いてくれました。いくつかの良い情報源もあります。

+0

本当に助かりました。 – LeviXC

1

[OK]を2つ選択します。 1つは、チューダーが絶対に正しいことです。オブジェクトではなく、直接的に期待しているクラスを使用するのが最善です。また、スタイル上、彼のポイントも正確です。

2つは、実際にオブジェクトのリストを使用する必要がある場合は、オブジェクトから、受け取ることを期待しているタイプにキャストバックする必要があるということです。それが効果的にコンパイル時エラーがどうあるべきかかかり、(クラスがキャストできない場合)はランタイムエラーになりよう

List<Object> list = inv.getAllInventoryItems(); 
for (Object item : list){ 
    System.out.println((Items) item).getItemName(); 
} 

しかし、私はこれをやってお勧めしません。

関連する問題