Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时实现接口_Java_Oop - Fatal编程技术网

Java 在运行时实现接口

Java 在运行时实现接口,java,oop,Java,Oop,我试图创建一个API模块,该模块具有执行所需函数所需的所有函数。但最终开发人员需要做的唯一一件事是根据他选择使用数据库还是文件系统来实现该类 有一个IContentProcess将在AssetManager中使用,AssetManager执行文件处理和其他功能。现在,我正在AssetManager类中实现ContentProcess,但我真的希望使用我的jar文件的最终开发人员能够实现,以便将文件保存在数据库或文件系统中 我需要在AssetManager类中执行哪些操作才能实现它 public

我试图创建一个API模块,该模块具有执行所需函数所需的所有函数。但最终开发人员需要做的唯一一件事是根据他选择使用数据库还是文件系统来实现该类

有一个IContentProcess将在AssetManager中使用,AssetManager执行文件处理和其他功能。现在,我正在AssetManager类中实现ContentProcess,但我真的希望使用我的jar文件的最终开发人员能够实现,以便将文件保存在数据库或文件系统中

我需要在AssetManager类中执行哪些操作才能实现它

public interface IContentProcessor
{

    public boolean deleteContent(String fileName) throws ResourceException;


    public boolean uploadContent(String fileName, InputStream contentStream) throws ResourceException;


    public InputStream downloadContent(String fileName) throws ResourceException;


    public boolean uploadContent(String fileName, BufferedImage imageStream) throws ResourceException;


    public boolean uploadContent(String fileName, String formatName, BufferedImage imageStream)
            throws ResourceException;


    public boolean moveContent(String fromFile, String toFile) throws ResourceException;


    public void validateFilePath(File newFile);
}
资产管理人
您已经用
spring
标记了它。你可以用它来做这件事。摆脱
createContentProcessor()
方法,改用Spring依赖项注入。例如,您的类将如下所示:

@Component
public class MyClass {

    // Will be set by Spring dependency injection
    @Autowired
    private IContentProcessor contentProcessor;

    // ...

    private boolean uploadContentStream(String filePath, InputStream contentStream)
    {
        try
        {
            return contentProcessor.uploadContent(filePath, contentStream);
        }
        catch (ResourceException rEx)
        {
            throw new SystemException(rEx.getMessage(), rEx);
        }
    }
}
然后,Spring配置将确定将使用的
IContentProcessor
的具体实现

如果希望在没有Spring的情况下执行此操作:可以使用反射动态创建接口的实例:

private IContentProcessor createContentProcessor() throws ClassNotFoundException,
        IllegalAccessException, InstantiationException {
    // You could get the class name from a config file
    String implClassName = "com.somepackage.ContentProcessorNFSImpl";

    // Load the class and create an instance
    // This requires the implementation to have a public no-args constructor
    return (IContentProcessor) Class.forName(implClassName).newInstance();
}

API实现

提供一个setter方法来注入实现

public class AssetManager {
   ...
   private IContentProcessor contentProcessor
   ...

   // This method to be invoked by client to set (a.k.a inject) customer implemenation
   public void setContentProcesssor(IContentProcessor c) {
      this.contentProcessor = c;
   }
}
然后,删除
IContentProcessor contentProcessor=createContentProcessor()上传ContentStream方法中的行

开发者(也称API用户)代码

开发者可以自由实现
IContentProcessor
,并使用
setContentProcessor
方法注入实现。您可以提供一些预构建的实现作为库的一部分,或者开发人员可以实现全新版本的
IContentProcessor

AssetManager m = new AssetManager(...);
m.setContentProcessor(new ContentProcessorNFSImpl());
...
m.uploadContentStream(...);

另外,不是创建
ContentProcessor
的实例,开发人员可以选择使用Spring框架,并在其代码中自动连接实现。

如何支持非Spring方式?@user1595858如果您的问题与Spring无关,为什么要用
Spring
标记它?我正在为基于Spring的应用程序以及非基于Spring的应用程序创建api。通常,如果默认情况下我在构造函数中设置了content processor,则可以从属性文件或等效文件中获取它,而不是硬编码
implClassName
。由开发人员设置contentProcessor是否仍然是更好的方法?如果您有一个默认实现,它将在90%的时间内工作,只有这样做才可以。我希望开发人员总是选择实现。
AssetManager m = new AssetManager(...);
m.setContentProcessor(new ContentProcessorNFSImpl());
...
m.uploadContentStream(...);