gpt4 book ai didi

java - 接口(interface)使用和多态编码

转载 作者:行者123 更新时间:2023-12-02 02:16:33 25 4
gpt4 key购买 nike

我有几节课。我想指出的是:BaseDAO 类,实现 QueryableParcelable 接口(interface)。基础一有几个子类,我想调用方法

public static ResultSet getDataFor(Queryable queryable) throws SQLException {
Statement statement = con.createStatement();
return statement.executeQuery(queryable.getSelectAllQuery());
}

一般来说,Base 的所有子系统都有两行。

但现在这个调用看起来很难看,就像 getDataFor(new Program()) 或使用不同的类。

所以基本上,我的问题是是否有更好的方法来实现此行为,而无需调用新实例。我想尽可能简洁,所以请随意提问

最佳答案

如果你不想修改类,我可以考虑三种解决方案。

<小时/>

使用枚举

如果您想要/需要更多地控制它将接收的类型:

enum BaseType {
PROGRAM(new Program()),
ANOTHER(new Another());
private BaseDAO baseDAO;
BaseType (BaseDAO baseDAO) {
this.baseDAO = baseDAO;
}
public BaseDAO getBaseDAO() {
return baseDAO;
}
}

public static ResultSet getDataFor(BaseType type) throws SQLException {
Statement statement = con.createStatement();
return statement.executeQuery(type.getBaseDAO().getSelectAllQuery());
}

使用静态导入

import static my.pack.BaseType;

getDataFor(PROGRAM);

没有静态导入

getDataFor(BaseType.PROGRAM);
<小时/>

使用反射

如果您不想/需要对其接收的类型进行更多控制:

public static ResultSet getDataFor(Class<? extends BaseDao> type) throws SQLException {
Statement statement = con.createStatement();
return statement.executeQuery(type.newInstance()
.getSelectAllQuery()); // handle exceptions
}

像这样使用

getDataFor(Program.class);
<小时/>

使用供应商

此外,如果您不想/需要对其接收的类型进行更多控制:

public static ResultSet getDataFor(Supplier<? extends BaseDao> supplier) throws SQLException {
Statement statement = con.createStatement();
return statement.executeQuery(supplier.get().getSelectAllQuery());
}

像这样使用

getDataFor(Program::new); // looks good, at least to me
<小时/>

由于类型删除,您不能为此使用泛型。如果java已经具体化了泛型,你可以使用类似 getDataFor<Program>() 的东西,但是做不到。

关于java - 接口(interface)使用和多态编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49226238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com