2015-09-05 40 views
0

有7-8类(实现可调用),它们具有一些相似的行为,即它们具有类似的功能和类似的实现。而且所有这些都使用HashMap(仅用于阅读目的),对于所有这些类都是相同的。 所以我决定做一个抽象的超类,它包含所有类似的方法加上这个hashMap作为一个静态成员。 我将为这些7-8个可调用类(因此这些也可以通过继承来调用)进行子类化,以便可以改进应用程序的性能。OO设计和初始化Asbtract超类中的静态成员

现在我有3个疑问:

1)是否有这样的设计缺陷任何可以和我进一步提高了吗?

2.)是否会出现任何并发问题,因为它是一个三层结构,可调用类位于底层的两个层次上?

3.)初始化静态块内部的静态成员(hashmap)是否错误?因为我的老板痴迷于使用静态成员和块。那么如果我在静态块中初始化这个映射会发生什么样的问题?

public abstract class AbSuper { 
private static HashMap hmap; 
private static CompletionService<String> service; 
private static int maxThreads = 10; 

static{ 
    initializeMap(); 
} 
public static void initializeMap(){ 
    //load from file 
} 

public HashMap getmap(){ 
    return hmap; 
} 

public void commonMethodOne(){ 
    //do something 
} 

public static CompletionService<String> getService(){ 
    ExecutorService executor = Executors.newFixedThreadPool(maxThreads); 
    service = new ExecutorCompletionService<String>(executor); 
    return service; 
} 

}

public class CallableOne extends AbSuper implements Callable<String>{ 

private List<String[]> taskList; 
protected HashMap resultMap; 

public List<String[]> getTaskList(){ 
    return taskList; 
} 

public String call(){ 

    for(String[] task : getTaskList()){ 
     getService().submit(new SubCallableOne(task)); 
    } 

    return "done with Callable One"; 
} 

}

public class SubCallableOne extends CallableOne { 

String[] task; 

public SubCallableOne(String[] task) { 
    this.task = task; 
} 

public String call(){ 
    //do what you are suppose to do 
    //and then access and populate "resultMap" fom superclass 
    return "done with subCallableOne"; 
} 

}

将有7-8 CallableOne /二/三thier相应SubCallableOne/2/3。

+2

你能否提供一些与你的问题相关的代码? http://stackoverflow.com/help/how-to-ask – user5292387

+0

我已经提供了它 –

回答

2

1)你真的需要使用静态成员吗​​?如果是这样,也许你应该把它封装在一个单独的类中,并通过封装而不是继承来使用它。我仍然使用常用方法保持超类。

但无论如何,您目前的代码有问题。即:

  • 你正在通过公开的方法AbSuper.getMap公开地图,它是可变的。任何代码都可以添加,删除或覆盖条目。它应该真的公开吗?它看起来只有子类正在使用它。如果是这样,您可以将其保护并返回给他们只读地图或副本,或者创建一个受保护的功能readFromMap(key)
  • AbSuper.getService方法:它是公共和静态的。任何类中的任何代码都可以提交任务或关闭它。除了你每次创建一个新的执行者。这可能是一个错误,因为每次拨打getService都会覆盖service变量。看起来你试图在这里实现一个单身人士,但失败了。

2)可调用的类可能是底部的类,但是由于公共静态方法以及由于公共方法而持有实例的任何人将基类中的功能展示给程序中的每个其他类。即使这些方法不存在,所有实例使用共享映射和执行程序服务的事实都可能导致意外的副作用。例如,提交的任务的执行顺序。 3)它本身没有错,但静态是众所周知的代码气味。它使课程很难测试。不能被重写。在纯粹的OO设计中,应该不需要静态。在你的情况下,地图将在第一次加载类时被初始化,所以任何对AbSuper.getMap的调用都会填充地图。但是你的地图有两个问题。第一个问题是,这通常不适合长时间操作,如从文件填充地图。您应该明确地做出长操作,不要将它们隐藏在构造函数或静态初始化器中。第二个是地图是可变的。