某些容器类包含基类“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/