小编use*_*585的帖子

通用接口

假设我想定义一个代表远程服务调用的接口.现在,对远程服务的调用通常会返回一些内容,但也可能包含输入参数.假设实现类通常只实现一种服务方法.鉴于以上信息,以下是一个糟糕的设计(它感觉不太正确):

public interface IExecutesService<A,B>
{
    public A executeService();
    public A executeService(B inputParameter);
}
Run Code Online (Sandbox Code Playgroud)

现在,假设我使用一个使用输入参数执行远程服务的类来实现此接口:

public class ServiceA implements IExecutesService<String,String>
{
  public String executeService()
  {
    //This service call should not be executed by this class
    throw new IllegalStateException("This method should not be called for this class...blabla");
  }

  public String executeService(String inputParameter)
  {
    //execute some service
  }
Run Code Online (Sandbox Code Playgroud)

关于上述问题我有两个问题:

  1. IExecutesService<A,B>在您想要提供需要不同输入参数和接口方法的返回类型的子类的情况下,是否使用通用接口()?
  2. 我怎样才能做到更好?即我想在一个公共接口(IExecutesService)下将我的服务执行者分组; 但是,实现类通常只实现其中一个方法,并且使用IllegalStateException感觉非常难看.此外,对于在IExecutesService<A,B>没有任何输入参数的情况下调用服务的实现类,B类型参数将是多余的.对于两个不同的服务调用来说,创建两个独立的接口似乎也是过度的.

java interface

54
推荐指数
3
解决办法
19万
查看次数

对接口和同步集合进行编程

这个问题涉及Java集合 - 特别是Hashtable和Vector - 但也可能适用于其他地方.

我在很多地方都读到了编程接口的好处,我同意100%.例如,在不考虑底层实现的情况下编程到List接口的能力肯定有助于解耦和测试目的.考虑到内部存储结构,随机访问时间等方面的差异,我可以看到ArrayList和LinkedList如何在不同的环境下应用.但是,这两个实现可以在同一个接口下使用...是很棒的.

我似乎无法放置的是某些同步实现(特别是Hashtable和Vector)如何适应这些接口.对我来说,他们似乎不适合这个模型.大多数底层数据结构实现似乎在数据存储方式(LinkedList,Array,排序树等)方面有所不同,而同步则处理可以访问数据的条件(锁定条件).让我们看一个方法返回Map集合的示例:

public Map<String, String> getSomeData();
Run Code Online (Sandbox Code Playgroud)

让我们假设应用程序完全不关心并发性.在这种情况下,我们对该方法通过接口返回的任何实现进行操作......每个人都很高兴.世界是稳定的.

但是,如果应用程序现在需要关注并发前端怎么办?我们现在无法在不考虑底层实现的情况下运行 - Hashtable会很好,但其他实现必须满足.让我们考虑3种情况:

1)在使用集合添加/删除时,使用同步块等强制执行同步.但是,如果返回同步实现(Hashtable),这不会是过度杀伤吗?

2)更改方法签名以返回Hashtable.然而,这将我们与Hashtable实现紧密联系在一起,因此,编程到界面的优势被抛到了窗外.

3)利用并发包并更改方法签名以返回ConcurrentMap接口的实现.对我来说,这似乎是前进的方向.

从本质上讲,似乎某些同步实现在集合框架中有点不合适,因为在对接口进行编程时,同步问题几乎迫使人们考虑底层实现.

我完全忽略了这一点吗?

谢谢.

java synchronization data-structures

8
推荐指数
1
解决办法
824
查看次数

一种方法应该承担多少责任?

这肯定是一个与语言无关的问题,而且现在已经困扰了我很长一段时间了.一个例子可能会帮助我解释我面临的两难困境:

让我们说我们有一个方法负责读取文件,用一些对象(存储文件中的信息)填充集合,然后返回集合......如下所示:

public List<SomeObject> loadConfiguration(String filename);
Run Code Online (Sandbox Code Playgroud)

我们还要说,在实现此方法时,如果返回的集合为空(大小为0),则应用程序继续运行似乎是不可行的.现在,问题是,该方法中是否应该进行此验证(检查空集合以及可能后续抛出异常)?或者,此方法应该唯一的责任是执行文件的加载并忽略验证任务,允许在方法之外的某个稍后阶段进行验证?

我想一般的问题是:将验证与方法执行的实际任务分离是否更好?通常,这会使事情在稍后阶段变得更容易改变或构建 - 在上面的例子的情况下,在稍后阶段可能会出现这样的情况,其中添加了不同的策略以从空事件中恢复从'loadConfiguration'方法返回的集合......如果在方法中完成验证(以及产生的异常),这将是困难的.

也许我在寻求一些教条式的答案时过于迂腐,相反,它只是依赖于使用方法的上下文.无论如何,我会非常有兴趣看到其他人对此有何看法.

谢谢大家!

oop

3
推荐指数
1
解决办法
195
查看次数

标签 统计

java ×2

data-structures ×1

interface ×1

oop ×1

synchronization ×1