假设一个项目包含几个类,每个类都有一个静态初始化块.这些块以什么顺序运行?我知道在一个类中,这些块按照它们在代码中出现的顺序运行.我已经读过它在各个类中都是一样的,但是我写的一些示例代码不同意这一点.我用过这段代码:
package pkg;
public class LoadTest {
public static void main(String[] args) {
System.out.println("START");
new Child();
System.out.println("END");
}
}
class Parent extends Grandparent {
// Instance init block
{
System.out.println("instance - parent");
}
// Constructor
public Parent() {
System.out.println("constructor - parent");
}
// Static init block
static {
System.out.println("static - parent");
}
}
class Grandparent {
// Static init block
static {
System.out.println("static - grandparent");
}
// Instance init block
{
System.out.println("instance - grandparent");
}
// Constructor
public Grandparent() { …
Run Code Online (Sandbox Code Playgroud) 这是我运行junit测试时会发生的事情......
Another CacheManager with same name 'cacheManager' already exists in the same VM. Please
provide unique names for each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same
CacheManager with same name or create one if necessary
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is:
DefaultConfigurationSource [ ehcache.xml or ehcache-failsafe.xml ]
Run Code Online (Sandbox Code Playgroud)
异常背后的原因是什么?可以同时运行多个cacheManager吗?
这就是我使用Sping 3.1.1配置cachManager的方法.它将cacheManager的范围明确设置为"singleton"
<ehcache:annotation-driven />
<bean …
Run Code Online (Sandbox Code Playgroud) 我可以对大多数Spring类进行单元测试,而无需执行Spring"东西".
我也可以在不使用Spring的情况下对@Before建议方法进行单元测试:
示例代码:
@Before("execution(* run(..)) && " + "" +
"target(target) && " +
"args(name)")
public void logName(Object target, String name) {
logger.info("{} - run: {}", target, name);
}
Run Code Online (Sandbox Code Playgroud)
示例测试:
@Test
public void testLogName() {
aspect.setLogger(mockLogger);
aspect.logName(this,"Barry");
assertTrue(mockLogger.hasLogged("TestAspect - run: Barry"));
}
Run Code Online (Sandbox Code Playgroud)
但是@Around建议处理ProceedingJoinPoint对象:
@Around("com.xyz.myapp.SystemArchitecture.businessService()")
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
// start stopwatch
Object retVal = pjp.proceed();
// stop stopwatch
return retVal;
}
Run Code Online (Sandbox Code Playgroud)
我不知道如何实例化ProceedingJoinPoint对象.如何在不启动整个Spring应用程序上下文的情况下测试此类?
(危险的问题,我希望当我遇到这个问题时答案已经在线)
使用Java 1.4,我有一个方法,我想在某些时候作为一个线程运行,但不是在其他人.所以我将它声明为Thread的子类,然后根据我的需要调用start()或run().
但我发现我的程序会随着时间的推移泄漏内存.我究竟做错了什么?
我有一个Java应用程序,它使用Spring的RestTemplate API编写简洁,可读的JSON REST服务使用者:
在本质上:
RestTemplate rest = new RestTemplate(clientHttpRequestFactory);
ResponseEntity<ItemList> response = rest.exchange(url,
HttpMethod.GET,
requestEntity,
ItemList.class);
for(Item item : response.getBody().getItems()) {
handler.onItem(item);
}
Run Code Online (Sandbox Code Playgroud)
JSON响应包含一个项目列表,正如您所看到的,我在自己的代码中有一个事件驱动的设计来依次处理每个项目.然而,整个列表是在存储器中作为其一部分response
,其RestTemplate.exchange()
产生.
我希望应用程序能够处理包含大量项目的响应 - 比如50,000,在这种情况下,实现有两个问题:
是否有一个相当成熟的Java JSON/REST客户端API,以事件驱动的方式消耗响应?
我想它可以让你做类似的事情:
RestStreamer rest = new RestStreamer(clientHttpRequestFactory);
// Tell the RestStreamer "when, while parsing a response, you encounter a JSON
// element matching JSONPath "$.items[*]" pass it to "handler" for processing.
rest.onJsonPath("$.items[*]").handle(handler);
// Tell the RestStreamer to make an HTTP request, parse it as …
Run Code Online (Sandbox Code Playgroud) 这段代码有些令人非常不满意:
/*
Given a command string in which the first 8 characters are the command name
padded on the right with whitespace, construct the appropriate kind of
Command object.
*/
public class CommandFactory {
public Command getCommand(String cmd) {
cmdName = cmd.subString(0,8).trim();
if(cmdName.equals("START")) {
return new StartCommand(cmd);
}
if(cmdName.equals("END")) {
return new EndCommand(cmd);
}
// ... more commands in more if blocks here
// else it's a bad command.
return new InvalidCommand(cmd);
}
}
Run Code Online (Sandbox Code Playgroud)
我对多个出口点没有悔改 - 结构清晰.但我对一系列几乎相同的if语句并不满意.我考虑过将一个字符串映射到命令:
commandMap = new …
Run Code Online (Sandbox Code Playgroud) 我正试图从俄罗斯短篇小说中提取一个单词列表.
#!/bin/sh
export LC_ALL=ru_RU.utf8
sed -re 's/\s+/\n/g' | \
sed 's/[\.!,—()«»;:?]//g' | \
tr '[:upper:]' '[:lower:]' | \
sort | uniq
Run Code Online (Sandbox Code Playgroud)
然而,这一tr
步骤并没有降低西里尔字母大写.我以为我在使用便携式角色课时很聪明!
$ LC_ALL=ru_RU.utf8 echo "?" | tr [:upper:] [:lower:]
?
Run Code Online (Sandbox Code Playgroud)
如果它是相关的,我通过从Chrome浏览器窗口复制粘贴到Vim获得俄语文本.它看起来正好在屏幕上(Putty终端).这是在Cygwin的bash shell中 - 它应该与Linux上的Bash完全相同(应该!).
什么是在管道中小写unicode文本的便携,可靠的方法?
在相当一段时间的情况下,我认为for
循环只能以下列格式存在:
for (INITIALIZER; STOP CONDITION; INC(DEC)REMENTER)
{
CODE
}
Run Code Online (Sandbox Code Playgroud)
然而,绝对不是这样; 看看Fisher-Yates Shuffle的这个JavaScript实现:
shuffle = function(o)
{
for (var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
};
Run Code Online (Sandbox Code Playgroud)
这个小片段彻底打动了我的脑海; 在一个简单的for循环声明中,这个世界是如何进行的?我的意思是......它甚至没有打开支架!所有的魔力正在做那里的内部for
声明.如果有人可以提供一个相对彻底的解释来说明世界上这个伏都教正在做它做什么,那将是绝对美妙的.非常感谢提前.
我的目标是创建一组对象,每个对象都有一个唯一的标识符.如果已存在具有该标识符的对象,我想使用现有对象.否则我想创建一个新的.我试图不使用Singleton这个词,因为我知道这是一个肮脏的词......
我可以使用工厂方法:
// A map of existing nodes, for getInstance.
private static Map<String, MyClass> directory = new HashMap<String, MyClass>();
public static MyClass getInstance(String name) {
MyClass node = directory.get(name);
if(node == null) {
node == new MyClass(name);
}
return node;
}
Run Code Online (Sandbox Code Playgroud)
或者同样,我可以有一个单独的MyClassFactory方法.
但我原本打算将MyClass子类化:
public class MySubClass extends MyClass;
Run Code Online (Sandbox Code Playgroud)
如果我不再做,并调用MySubClass.getInstance():
MyClass subclassObj = MySubClass.getInstance("new name");
Run Code Online (Sandbox Code Playgroud)
...然后subclassObj将是一个普通的MyClass,而不是MySubClass.
然而,在每个子类中重写getInstance()似乎很容易.
我缺少一个简洁的解决方案吗?
这是问题的通用版本.更具体,因为回答者要求他们.
该程序用于生成表示软件片段的节点之间的依赖关系的有向图.子类包括Java程序,Web服务,存储的SQL过程,消息驱动的触发器等.
因此,该网络中的每个类都是"is-a"元素,并且具有导航和修改与其他节点的依赖关系的方法.子类之间的区别在于populate()
用于从适当的源设置对象的方法的实现.
假设名为'login.java'的节点知道它对'checkpasswd.sqlpl'有依赖性:
this.addDependency( NodeFactory.getInstance("checkpasswd.sqlpl"));
Run Code Online (Sandbox Code Playgroud)
问题是checkpasswd.sqlpl对象此时可能已存在,也可能尚未存在.
这个简单的.c文件:
#include <unistd.h>
void test() {
char string[40];
gethostname(string,40);
}
Run Code Online (Sandbox Code Playgroud)
...正常编译时,工作正常:
$ cc -Wall -c -o tmp.o tmp.c
$
Run Code Online (Sandbox Code Playgroud)
...但是在C99模式下编译时,会发出警告:
$ cc -Wall -std=c99 -c -o tmp.o tmp.c
tmp.c: In function `test':
tmp.c:5: warning: implicit declaration of function `gethostname'
$
Run Code Online (Sandbox Code Playgroud)
结果.o文件很好,链接工作.我只是想摆脱警告.我可以通过在我自己的.h文件中添加声明来以一种hacky方式实现这一点.
什么是C99,这意味着unistd.h中的声明不包括在内?这可以克服,而不放弃C99的优点吗?
我看到其他标准库存在同样的问题.