容器对象中的通用getter

时间:2012-11-14 13:31:55

标签: java oop

某个容器类包含基类“Table”的对象列表(如WoodenTable,MetalTable ...)。每个Table类都保留其MaterialType(MaterialType.Wood,MaterialType.Metal ...)。问题是如何为容器类提供适当的getter方法,该方法可以返回Table的每个SubClass。

到目前为止,我发现了以下几种方法:

1.以材料类型作为参数。如果T的类型与materialType不对应,则此处的危险是ClassCastException:

<T extends Table> T getTable(MaterialType materialtype)
WoodenTable table = getTable(MaterialType.Wood);
MetalTable table = getTable(MaterialType.Wood); // ups... exception

2.Getter with Class参数。安全但对用户不太清楚(与MaterialType作为参数比较):

<T extends Table> T getTable(Class<T> tableClass)
WoodenTable table = getTable(WoodenTable.class);

3.每个表子类的获取。使用,编写和添加新的Table子类很麻烦:

WoodenTable getWoodenTable()
WoodenTable table = getWoodenTable();

4.Getter for Table界面。如有必要,在容器类之外完成转换。

Table getTable(MaterialType materialType)
WoodenTable woodenTable = (WoodenTable)getTable(MaterialType.Wood) 

还有其他(更好)的方法吗?如果没有,那么哪一个最适合或最不臭?

2 个答案:

答案 0 :(得分:0)

应该就是这么简单:

public Table getTable()  
{  
     return this.table;
}  

这将返回一个Table对象,由调用者根据需要进行操作。与以下块类似:

public Collection<String> getCollection()  
{  
     return new ArrayList<String>();
}  

正文返回ArrayList但该函数确实返回Collection。使用对象之间最常见接口的定义良好的API将为您提供同样的灵活性。

编辑

  

是的,这可能是一个用例,但我经常需要一些东西   like:for(表t:TableContainer){   (SubClassA)t.doSomethingSpecificForA();}这就是我的问题   开始。

让我们假设以下接口和实现:

    public interface Table  
    {  
        Table getTable();  
        void doSpecial();  
    }


public class WoddenTable implements Table  
{  
     ...  
     public Table getTable()  
     {  
         return this;
     }    

     public void doSpecial()  
     {  
         mySpecial();  
     }  

     private void mySpecial()  
     {  
         System.out.println("Wooden");  
     }  
}    

public class MetalTable implements Table  
{  
     ...  
     public Table getTable()  
     {  
         return this;
     }    

     public void doSpecial()  
     {  
         mySpecial();  
     }  

     private void mySpecial()  
     {  
         System.out.println("Metal");  
     } 
}  

和以下代码:

public static void main(String[] args)  
{  
        Collection<Table> tables = new ArrayList<Table>();  
        tables.add(new WoodenTable());  
        tables.add(new MetalTable());  
        for(Table table : tables)  
        {  
              table.doSpecial();  
        }  
}  

这里的方法是共享公共API。并且每个类的内部都没有暴露,因此需要为每个类做一些事情special隐藏在公共接口后面。这可以防止必须执行检查或任何其他混乱方法来解决此类问题。

答案 1 :(得分:0)

我建议不再考虑表格与属性(材料)的数据结构,并开始将它们视为“人”(Object Thinking)。不要从中获得“材料”。相反,让他们揭露他们的行为。

当您更改表格的设计时,您将自动更改其容器的设计。显而易见的是,容器不应该关心桌子的材料,但应该让他们控制他们是想要离开容器还是留在那里。