java - 容器对象中的通用 getter

标签 java oop

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

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

1.以 Material 类型为参数的Getter。如果 T 的类型与 materialType 不对应,这里的危险是 ClassCastException:

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

2.带Class参数的Getter。安全但对用户来说不是那么清楚(与作为参数的 MaterialType 相比):

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

3.每个表子类的Getter。使用、编写和添加新的表子类很麻烦:

WoodenTable getWoodenTable()
WoodenTable table = getWoodenTable();

4.Table接口(interface)的Getter。如有必要,在容器类之外进行转换。

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

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

最佳答案

应该就是这么简单:

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

这将返回一个 Table 对象,调用者可以根据需要对其进行处理。类似于以下 block :

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

主体返回一个ArrayList,但函数实际上返回一个Collection。使用对象之间最常见接口(interface)的定义良好的 API 将为您提供同样的灵 active 。

编辑

Yes, that could be one use case but quite often I need also something like : for(Table t : TableContainer) { (SubClassA)t.doSomethingSpecificForA();} and that's were my problems begin.

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

    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();  
        }  
}  

这里的方法是有一个共享的公共(public) API。并且每个类的内部都没有暴露,所以需要为每个类做一些特殊的事情隐藏在公共(public)接口(interface)后面。这避免了必须执行检查实例或任何其他困惑的方法来解决此类问题。

关于java - 容器对象中的通用 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13379777/

相关文章:

java - 在 ms word(97-2003) 中导出报告,而不在 jasper 报告中使用 RTFExporter

java - 如何将类型 'java.lang.String' 的值转换为所需类型 'java.util.Date' ?

c# - 使用全局变量暂停事件源系统命令

java.lang.IllegalStateException : [TextView] must not be null

用于 session 检查的 Java FilterImplementation

python - 类设计: Initializing and updating instance variables elegantly

java - 与不可变对象(immutable对象)一起使用的类工厂 (java) 方法的调用方法

python - python中的链式调用父初始化器

java - IntelliJ 无法使用 ClassNotFoundException : org. apache.log4j.Priority 进行编译

python - Python 中的类/OO 是一种好方法吗?