- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有 7-8 个类(可调用的实现)具有一些相似的行为,即它们具有一些相似的函数和相似的实现。而且所有这些都使用 HashMap(仅用于阅读目的),这对于所有这些类都是相同的。因此,我决定创建一个抽象父类(super class),其中包含所有类似的方法以及此 hashMap 作为静态成员。我将为这 7-8 个可调用类创建子类(因此这些类也可以通过继承来调用),以便提高应用程序的性能。
现在我有 3 个疑问:
1.) 这个设计有什么缺陷吗?我可以进一步改进它吗?
2.) 是否会发生任何并发问题,因为它是一个三级层次结构,可调用类位于底部两级?
3.) 在静态 block 内初始化静态成员(hashmap)是否错误?因为我的老板非常反对使用静态成员和 block 。那么,如果我在静态 block 内初始化此映射,可能会出现什么问题?
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/two/third 以及相应的 SubCallableOne/two/third。
最佳答案
1)你真的需要使用静态成员吗?如果是这样,也许您应该将其封装在一个单独的类中,并通过封装而不是继承来使用它。我仍然会保留一个具有常用方法的父类(super class)。
但无论如何,您当前的代码都有问题。即:
AbSuper.getMap
而且它是可变的。任何代码都可以添加、删除或覆盖条目。真的应该公开吗?看起来只有子类在使用它。如果是这样,您可以将其设置为 protected 并向其返回只读映射或副本,或者创建 protected 函数 readFromMap(key)
相反。AbSuper.getService
方法:它是公共(public)的、静态的。任何类中的任何代码都可以提交任务或关闭它。只不过您每次都创建一个新的执行器。这可能是一个错误,因为每次调用 getService
将覆盖 service
多变的。看起来您试图在这里实现单例但失败了。2) 可调用类可能是底部的类,但是由于公共(public)静态方法,您将基类中的功能暴露给程序中的每个其他类,并且由于公共(public)方法而向持有实例的任何人公开。即使这些方法不存在,所有实例都使用共享映射和执行器服务这一事实也可能会导致意外的副作用。例如提交任务的执行顺序。
3)这本身并没有错,但静态是众所周知的代码味道。这使得类很难测试。并且不能被覆盖。在纯面向对象设计中,不需要静态。在您的情况下, map 将在第一次加载类时初始化,因此任何对 AbSuper.getMap
的调用将填充 map 。但是您的 map 有两个问题。第一个是,这通常不适合进行长时间操作(例如从文件填充 map )。您应该使长操作显式化,不要将它们隐藏在构造函数或静态初始值设定项中。第二个是 map 是可变的。
关于java - 面向对象设计和在抽象父类(super class)中初始化静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32414069/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!