Java 我们可以使用依赖倒置原理实现100%的操作吗?

Java 我们可以使用依赖倒置原理实现100%的操作吗?,java,android,solid-principles,Java,Android,Solid Principles,在我的日常编程中,我尽最大努力遵循solid原则和其他设计模式,但在某些情况下很难做到,特别是使用依赖倒置原则,对于层次类,创建工厂类并将对象存储在那里可能很容易,对于singleton或builder也是如此,但当您在方法中使用单个类对象时,问题就出现了,该方法是不断变化的,并且同样没有层次关系 //在newTaskFor()方法中,倾斜原则被违反 所以,如何在日常程序或其上解决这些问题,可以在容器类中使用new关键字 protected <T> RunnableFutur

在我的日常编程中,我尽最大努力遵循solid原则和其他设计模式,但在某些情况下很难做到,特别是使用依赖倒置原则,对于层次类,创建工厂类并将对象存储在那里可能很容易,对于singleton或builder也是如此,但当您在方法中使用单个类对象时,问题就出现了,该方法是不断变化的,并且同样没有层次关系

//在newTaskFor()方法中,倾斜原则被违反 所以,如何在日常程序或其上解决这些问题,可以在容器类中使用new关键字

    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
     return new FutureTask<T>(callable);  //violating Dip principle
     }

/**
 * @throws RejectedExecutionException {@inheritDoc}
 * @throws NullPointerException       {@inheritDoc}
 */
public Future<?> submit(Runnable task) {
    if (task == null) throw new NullPointerException();
    RunnableFuture<Void> ftask = newTaskFor(task, null);
    execute(ftask);
    return ftask;
}
protectedrunnablefuture newTaskFor(可调用可调用){
返回新的FutureTask(可调用);//违反Dip原则
}
/**
*@throws-RejectedExecutionException{@inheritDoc}
*@throws-NullPointerException{@inheritardoc}
*/
公共未来提交(可运行任务){
如果(task==null)抛出新的NullPointerException();
RunnableFuture ftask=newTaskFor(任务,空);
执行(ftask);
返回ftask;
}

在某个地方总会有混凝土。如果你想把DIP应用于所有的东西,那么几乎所有的类型都必须被隐藏在高级特定的接口后面,这是不实用的

例如,您的高级模块为声明了
newTaskFor
,它可以很好地构建自己的
未来
抽象,而这些抽象不会直接耦合到Java的本机API,但这可能需要做大量的工作,却没有什么好处

我经常问自己这个问题的一个很好的例子是,我设计了一个简单的web爬虫库,它必须大量操作HTML文档。我可以选择是耦合到一个特定的库,比如Jsoup,还是创建自己的抽象以避免紧密耦合。因为最后我必须支持复杂的文档查询和操作,所以我发现在Jsoup之上构建另一个抽象层是非常不切实际的,在这个抽象层中我必须重新定义几乎所有的节点接口

但是,在这些情况下,有效抽象的关键是只关注系统真正需要的API部分,而不关注其他部分,并确保以特定于领域的方式表达抽象。如果您最终模拟了整个API,那么您的抽象很可能会受到特定实现的高度影响如果您发现需要底层库的所有功能,那么将其抽象出来可能成本太高。

编辑:

我刚刚检查了一下,似乎我在第三段中撒了谎,我最终制作了一个API,如下所示(几年前,我似乎只支持我拥有的最小用例,而不是复杂的库),但是诚实地说,
Scraper
只支持非常基本的提取,而这种提取可能弊大于利


您所说的
是什么意思?或者在容器类中使用new关键字是可以的?首先,您在使用单类对象时提到了
。那么,在当前示例中有两个类吗?你能详细说明一下这个例子吗?100%抽象是什么意思?是否有文件说明这是DIP的目标?