gpt4 book ai didi

java - 使用泛型和通配符进行合适的设计

转载 作者:行者123 更新时间:2023-12-01 05:25:57 26 4
gpt4 key购买 nike

我正在尝试确定泛型是否能够帮助我设计更好且可扩展的解决方案。在我的应用程序中,有一个模型类负责从数据源加载数据,我使用 ModelProxy 类来公开模型类中的一些方法。

public interface ModelProxy {
public int getOrderCount();
public int getCustomerCount();
}

public abstract class AbstractModel {
public abstract ModelProxy loadData(Configuration configuration);
}

public class ConcreteModel extends AbstractModel {
public ModelProxy loadData(Configuration configuration) {
loadInternal();
return new ConcereteModelProxy(this);
}
}

到目前为止,一切看起来都不错,但我想看看泛型(带通配符)是否可以帮助我设计一个更好的解决方案,允许扩展 ModelProxy 接口(interface)或 Configuration 类。例如,在另一个具体模型类中,我想使用 ExtendedConfiguration 类和 ExtendedModelProxy。

public ExtendedModelProxy extends ModelProxy {
// Additional methods
public int getTotalCount();
}

public class ConcereteModel2 extends AbstractModel {
public ExtendedModelProxy loadDate(ExtendedConfiguration configuration) {
return new ConcreteExtendedModelProxy(this);
}
}

Java 泛型能帮助我实现上述目标吗?或者也许我的设计有缺陷,我需要重新设计它。任何建议都会非常有帮助。

谢谢

客户端代码示例:

public abstract class Service {
public ModelProxy load(Configuration configuration) {
return getModel().loadData(configuration);
}

protected abstract AbstractModel getModel();
}

public class ServiceImpl extends Service {
protected AbstractModel getModel() {
return new ConcreteModel();
}

public static void main() {
Service service = new ServiceImpl();
ModelProxy proxy = service.load(configuration);
System.out.println(proxy.getOrderCount());
}
}

public class ExtendedServiceImpl extends Service {
protected AbstractModel getModel() {
return new ConcreteModel2();
}

public static void main() {
Service service = new ExtendedServiceImpl();
ExtendedModelProxy proxy = (ExtendedModelProxy) service.load(configuration);
System.out.println(proxy.getTotalCount());
}
}

我希望不要混淆太多。在 ExtendedServiceImpl 中,您可以看到我需要将 ModelProxy 转换为 ExtendedModelProxy 才能访问 getTotalCount 方法。我的想法是也许我可以使用泛型来避免强制转换。类似的东西

public abstract <M extends ModelProxy, C extends Configuration> M loadData(C configuration);

也许我把事情变得过于复杂了,实际上我当前的设计就是我所需要的。不确定...

最佳答案

这种事情怎么样

package jj;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.util.*;

interface Configuration {
}

interface Model {
}

interface OrderModel extends Model {
public int getOrderCount();
public int getCustomerCount();
}

interface CustomerModel extends Model {
public int getName();
public int getAddress();
}

abstract class AbstractModel<M extends Model> {
@SuppressWarnings("unchecked")
public M loadData(Configuration configuration) {
// connect to stuff
Object connection = null;
loadInternal(configuration, connection);
// do some other stuff
return (M) Proxy.newProxyInstance(null, new Class<?>[]{getModelClass()}, null);
}

protected abstract void loadInternal(Configuration configuration,
Object connection);

protected abstract InvocationHandler getInvocationHandler(Object connection);
protected abstract Class<M> getModelClass();
}

class ConcreteOrderModel extends AbstractModel<OrderModel> {
public void loadInternal(Configuration configuration,
Object connection) {
}

protected InvocationHandler getInvocationHandler(Object connection) {
return null;
}

protected Class<OrderModel> getModelClass() {
return OrderModel.class;
}
}

class ConcreteCustomerModel extends AbstractModel<CustomerModel> {
public void loadInternal(Configuration configuration,
Object connection) {
}

protected InvocationHandler getInvocationHandler(Object connection) {
return null;
}

protected Class<CustomerModel> getModelClass() {
return CustomerModel.class;
}
}

关于java - 使用泛型和通配符进行合适的设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9677068/

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