在Java的隐藏功能中,最佳答案提到了Double Brace Initialization,它具有非常诱人的语法:
Set<String> flavors = new HashSet<String>() {{
add("vanilla");
add("strawberry");
add("chocolate");
add("butter pecan");
}};
Run Code Online (Sandbox Code Playgroud)
这个成语创建了一个匿名内部类,其中只包含一个实例初始化程序,"可以使用包含作用域中的任何[...]方法".
主要问题:这听起来效率低吗?它的使用是否应限于一次性初始化?(当然炫耀!)
第二个问题:新的HashSet必须是实例初始化程序中使用的"this"...任何人都可以了解机制吗?
第三个问题:在生产代码中使用这个成语是否过于模糊?
简介:非常非常好的答案,谢谢大家.在问题(3)中,人们认为语法应该是清楚的(尽管我建议偶尔发表评论,特别是如果你的代码会传递给可能不熟悉它的开发人员).
在问题(1)上,生成的代码应该快速运行.额外的.class文件会导致jar文件混乱,并且会稍微减慢程序启动速度(感谢@coobird测量它).@Thilo指出垃圾收集可能会受到影响,在某些情况下,额外加载类的内存成本可能是一个因素.
问题(2)对我来说最有趣.如果我理解答案,那么DBI中发生的事情是匿名内部类扩展了由new运算符构造的对象的类,因此具有引用正在构造的实例的"this"值.井井有条.
总的来说,DBI让我感到非常好奇.Coobird和其他人指出,您可以使用Arrays.asList,varargs方法,Google Collections和提议的Java 7 Collection文字获得相同的效果.Scala,JRuby和Groovy等较新的JVM语言也为列表构建提供了简明的符号,并且与Java良好地互操作.鉴于DBI使类路径混乱,减慢了类加载速度,并使代码更加模糊,我可能会回避它.但是,我打算在一位刚刚获得SCJP的朋友身上发表这篇文章,并且喜欢关于Java语义的好朋友!;-) 感谢大家!
7/2017:Baeldung 对双支撑初始化有很好的总结,并认为它是一种反模式.
12/2017:@Basil Bourque指出,在新的Java 9中你可以说:
Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan");
Run Code Online (Sandbox Code Playgroud)
这肯定是要走的路.如果您遇到早期版本,请查看Google Collections的ImmutableSet.
NoSQL指的是打破关系数据库和ACID保证历史的非关系数据存储.流行的开源NoSQL数据存储包括:
我想知道您的具体问题 - SO读者 - 使用数据存储解决了您使用的NoSQL数据存储.
问题:
我正在寻找第一手经验,所以除非你有这个经验,否则请不要回答.
database nosql graph-databases key-value-store distributed-database
首先我要说的是,我有很多Java经验,但最近才对函数式语言感兴趣.最近我开始关注Scala,这似乎是一种非常好的语言.
但是,我一直在阅读Scala 编程中的 Scala的Actor框架,有一点我不明白.在第30.4章中,它表示使用react而不是receive可以重用线程,这对性能有好处,因为线程在JVM中很昂贵.
这是否意味着,只要我记得打电话react而不是receive,我可以开始尽可能多的演员?在发现Scala之前,我一直在和Erlang一起玩,编程Erlang的作者自豪地生成了超过20万个进程,而且不会出汗.我讨厌用Java线程做到这一点.与Erlang(和Java)相比,我在Scala中看到了什么样的限制?
此外,此线程如何在Scala中重用?为简单起见,我们假设我只有一个线程.我开始的所有演员都会在这个帖子中按顺序运行,还是会进行某种任务切换?例如,如果我启动两个互相ping消息的actor,如果它们在同一个线程中启动,我是否会冒死锁?
根据Scala编程,编写演员使用react比使用更困难receive.这听起来似乎有道理,因为react不会回来.然而,本书接着展示了如何react使用循环内部Actor.loop.结果,你得到了
loop {
react {
...
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这看起来非常相似
while (true) {
receive {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在本书前面使用过.尽管如此,这本书还是说"在实践中,程序至少需要少数几个receive".那我在这里错过了什么?除了回归之外,receive做什么不能做到react?为什么我关心?
最后,进入我不理解的核心:本书不断提及如何使用react可以丢弃调用堆栈来重用线程.这是如何运作的?为什么有必要丢弃调用堆栈?当函数通过抛出异常(react)而终止时,为什么可以放弃调用堆栈,而不是当它通过返回(receive)终止时?
我的印象是Scala中的Programming一直在掩盖这里的一些关键问题,这是一种耻辱,因为否则它是一本真正优秀的书.
我们正在考虑将我们的Rest API服务器(它在Web服务中,在Symfony PHP上)移动到Scala有以下几个原因:速度,无开销,更少的CPU,更少的代码,可扩展性等.我不知道Scala直到几个几天前,但我一直很享受这些天我用Scala书和所有博客文章和问题学习的东西(它不是那么难看!)
我有以下选择:
我将不得不使用的一些东西:HTTP请求,JSON输出,MySQL(数据),OAuth,Memcache(缓存),日志,文件上传,统计(可能是Redis).
你会推荐什么?
我有一个现有的应用程序,它针对log4j进行所有日志记录.我们使用了许多其他库,它们也使用log4j,或者记录Commons Logging,最终使用我们环境中的log4j.我们的一个依赖项甚至记录了slf4j,它也可以正常工作,因为它最终也会委托给log4j.
现在,我想为这个应用程序添加ehcache以满足一些缓存需求.以前版本的ehcache使用了commons-logging,它在这种情况下可以很好地工作,但是从版本1.6-beta1开始,它们已经删除了对commons-logging的依赖,而是用java.util.logging替换它.
不熟悉java.util.logging提供的内置JDK日志记录,是否有一种简单的方法可以将针对log4j发送到JUL的任何日志消息记录下来,因此我可以使用现有配置并设置任何日志记录来来自ehcache?
看看JUL的javadocs,看起来我可以设置一堆环境变量来改变使用的LogManager实现,也许可以用它来将log4j包装Logger在JUL Logger类中.这是正确的方法吗?
具有讽刺意味的是,当世界其他地方(大部分)使用第三方库时,图书馆使用内置JDK日志记录会引起如此头疼.
我想在Google App Engine上创建一个RESTful应用程序.我想提供XML和JSON服务.我简要地试过了Restlet,Resteasy和Jersey.除了Restlet中的一些简单示例之外,我没有取得任何成功.
您能否分享使用Java在Google App Engine上创建Restful Web应用程序的经验,或者提供有关GAE上述工具包的任何见解?
谢谢!
编辑(2009-07-25):
我决定暂时使用Restlet.到目前为止似乎完美无瑕.请发布您可能拥有的任何其他见解/意见.你遇到了什么问题?你在GAE/J上成功使用过Jersey/Restlet/Resteasy吗?如果是这样,我们想听听它!
您如何设计/构建可伸缩的应用程序?任何有助于理解如何扩展应用程序的书籍或网站的建议?
谢谢
我目前正在开发一个项目,它需要持久保存任何类型的对象(我们没有任何控制权的实现),因此这些对象可以在之后恢复.
我们无法实现ORM,因为我们无法在开发时限制库的用户.
我们的第一个选择是使用Java默认序列化对其进行序列化,但是当用户开始传递同一对象的不同版本(属性更改类型,名称等)时,我们在恢复对象时遇到了很多麻烦.
我们尝试过使用XMLEncoder类(将对象转换为XML),但我们发现缺少功能(例如,不支持Enums).
最后,我们还尝试了JAXB,但这会强制我们的用户注释他们的类.
还有什么好办法吗
我常常有一个班级:
public class Foo
{
private String field1;
private String field2;
// etc etc etc
}
Run Code Online (Sandbox Code Playgroud)
这使得field1和field2的初始值等于null.拥有我的所有String类字段会更好吗?
public class Foo
{
private String field1 = "";
private String field2 = "";
// etc etc etc
}
Run Code Online (Sandbox Code Playgroud)
然后,如果我与类定义一致,我会避免很多空指针问题.这种方法有什么问题?
我在表中有两个索引字段 - type和userid(单个索引,而不是复合索引).
types字段值非常有限(假设它只有0或1),因此50%的表记录具有相同的值type.userid另一方面,值来自更大的集合,因此具有相同userid值的记录量很小.
这些查询中的任何一个都会比另一个运行得更快:
select * from table where type=1 and userid=5
select * from table where userid=5 and type=1
Run Code Online (Sandbox Code Playgroud)
此外,如果两个字段都没有编入索引,它会改变行为吗?