- 浏览: 451573 次
- 性别:
- 来自: 北京
博客专栏
-
Java函数式编程
浏览量:41632
最新评论
-
niqingyang:
看到lambda表达式后,感觉Java不再优雅了,还是喜欢面向 ...
Java函数式编程(一) -
tomqyp:
太过危言耸听了,抛开那少比较底层的语言,高级语言中反到是不少都 ...
动态语言已死? -
windshome:
设计这样JVM的人和在真正产品实现里写这样代码的人都是疯子。前 ...
JVM的自愈能力 -
yixiandave:
有多少人把JAVA8用在生产环境了?
JVM的自愈能力 -
ljbupc:
这个好像是1.8版jvm的新特性;1.7以下的不行(JVM-H ...
JVM的自愈能力
文章列表
注:数据有限,一家之言,仅供娱乐
距离我们去年的_回顾2013年应用服务器市场份额_已经有超过一年的时间了。为了看下这14个月来格局有没有发生变化,我们收集了从去年1月到2014年5月间启动了On Demand Plumbr的783个不同环境的 ...
框架为程序员提供了一些有用的特性从而简化了应用开发的过程。Java开发人员经常使用框架,由于框架非常流行,因此市场上你会发现各种各样的Java框架。新手经常在论坛里面提问,“哪个Java框架最好?"
首先,没有一个框架是最好的,因为他们都有自己的优点和缺点。因此,你必须结合项目的需求来进行考虑。你必须考虑到像可伸缩性,复杂性,截止日期等关键因素,当然了,还有预算。
今天,我们来讨论下两个非常著名的Java框架,Play和Grails的优缺点。
Play
这是市场上当前最好用的框架之一了。开发人员喜欢它是因为它容易编程,可扩展并且功能强大。Play还可以使用Scala语言来进 ...
当你设计新的API时你需要做很多决策。一般都是基于大量的设计原则来做出的这些决策。Joshua Bloch在他的报告中总结了一些。他提到的主要原则有以下这些:
易于学习
易于使用
不易误用
写出的代码易于阅读及维护
足够强大,能满足需求
易于扩展
对使用者友好
从上面这个列表可以看到,Joshua Bloch强调的是可读性和易用性。但这个列表中完全忽略了的一点就是性能。不过性能会影响到你的设计 吗?
要回答这个问题,我们先来设计一个API的简单的用例,然后再测试它的性能。这样我们可以根据结果,来看下API的设计是否会对性能产生影响。作为例子,我们使用的是一个经典的从服务或者存 ...
我不知道从何时起,速度(效率)这个词在软件开发领域安家落户了,以前可从来没有这么流行过。然而我非常确定的一点是如果你提到运动却没有提到三大定律的话,艾萨克·牛顿先生肯定会不高兴。
第一定律
在一个惯性 ...
我所设计的绝大部分类,我都会关注它们的不可变性。要想获得不可变性需要这样做:
使用构造方法来初始化所有的属性。
这些属性没有setter方法。
然而,这样的设计使得测试更加复杂甚至无法测试。为了能进行测试,你还需要一个public的无参构造方法。
其它需要无参构造方法的情况包括:
序列化对象的反序列化。
子类中没有调用父类的构造函数。
其它
下面是它的一些解决方案。
1. 实现一个public的无参构造方法
最简单的方式就是创建一个public的无参构造函数了,然后添加一个大的醒目的警告信息让开发人员别去使用这个方法。你可以想像得到,这种方法虽然简单,但是它无法强制约束什 ...
反射对Java开发人员来说是最强大的功能之一了。标准的Java API真的很难使用,尤其是搜索和查询某些特殊的方法的时候。
比如说,我最近在参与的一个项目,要取出一个类的所有返回string,不带参数的,且以to开头的public方法,写出来的代码大概像下面这样:
ArrayList<Method> results = new ArrayList<Method>();
for (Method m : String.class.getDeclaredMethods()) {
if (Modifier.isPu ...
序列化及SerialVersionUID困扰着许多Java开发人员。我经常会看到这样的问题,什么是SerialVersionUID,如果实现了Serializable接口的类中没有定义SerialVersionUID的话会怎样?抛开它的复杂性以及不太常用不说,一个原因就是Eclipse在缺少了Se ...
Java是一门设计为运行于虚拟机之上的编程语言,因此它需要一次编译,处处运行(当然也是一次编写,处处测试)。因此,安装到你系统上的JVM是原生的程序,而运行在它之上的代码是平台无关的。Java字节码就是你写的源代码的中间表现形式,也就是你的代码编译后的产物。你的class文件就是字节码。
简单点说,字节码就是JVM使用的代码集,它在运行时可能会被JIT编译器编译成本地代码。
你玩过汇编语言或者机器代码吗?字节码就是类似的东西,不过业界中许多人也很少会用及它,因为基本没这个必要。然而它对于理解程序运行是很重要的,如果你想在酒吧把某人PK下去,它也非常有用。
首先,我们先看一下字节码的基础知识 ...
UNIX开发人员(以下简称UD, Unix Developer):我再也不会碰LISP了。太可怕了!
我:为什么这么说?
UD:它的语法!那个波兰式的前缀语法看得眼睛都花了,也就只有它在用了。你看看这些个括号!
我:好吧,但很多人认为这个可读性很强,尽管他们也承认是得花点时间才能习惯它。但我觉得你错了。很多人其实每天都在使用Lisp语法。。。
UD:据我所知,没人像你说的这样。
我:。。他们可能自己都没意识到这个。事实上,我认为你也在使用它。
UD:等等,你说什么?!
我:你用的这个特殊的Lisp语法的变种又叫做Bourne Shell。
UD:这我可听不明白了。shell和Li ...
在最近完成的一次Java.net的投票中,有超过75%的开发人员认为使用非Java语言是有一定的原因的。有19%(有点吃惊)的开发人员认为,在JVM上完全没有必要使用非Java语言进行开发。总共有181个人进行了投票,有一人进行了评论。下 ...
Java是最流行的编程语言之一,但似乎并没有人喜欢使用它。好吧,实际上Java是一门还不错的编程语言,由于最近Java 8发布了,我决定来编辑一个如何能更好地使用Java的列表,这里面包括一些库,实践技巧以及工具。
这篇文章在GitHub上也有。你可以随时在上面贡献或者添加你自己的Java使用技巧或者最佳实践。
- 编码风格
- 结构体
- builder模式
- 依赖注入
- 避免null值
- 不可变
- 避免过多的工具类
- 格式
- 文档
- Stream
- 部署
- ...
我们先从一个小故事开始讲起。几个星期前,我在Java核心库的邮件列表中发起一个修改的提议,希望能重写一些目前是final类型的方法。这个提案引发了好几个讨论的话题——其中一个是方法是不是final类型的,它的性能差距到底有多大。
关于取消final是否会导到性能变差我其实有一些自己想法,但我决定先抛开这些主观看法,想找找看有没有这个课题相关的一些基准测试的数据。很不幸的是我没找到。并不是说真的不存在或者没有人研究过这种情况,只能说我没有看到有公开的同行审查过的代码。看来,得自己写点测试了。
基准测试方法论
我决定使用JMH这个靠谱的框架来将这些基准测试进行打包。如果你不相信会有框架能帮助你 ...
默认方法给JVM的指令集增加了一个非常不错的新特性。使用了默认方法之后,如果库中的接口增加了新的方法,实现了这个接口的用户类能够自动获得这个方法的默认实现。一旦用户想更新他的实现类的话,只需覆盖一下这个默认方法就可以了,取而代之的是一个在特定场景下更有意义的实现。更棒的是,用户可以在重写的方法里面调用接口的默认实现来增加一些额外的功能。
目前为止一切都还不错。然而,给现有的Java接口增加默认方法可能会导致代码的不兼容。看个例子就很容易能明白了。假设有一个库,它需要用户实现它的一个接口作为输入:
interface SimpleInput {
void foo();
void ...
为什么我给JVM分配的堆已经足够大了,但在给一个数据结构分配内存的时候却抛出了OutOfMemoryError异常?这是我最近面临的一个问题。
看了下开发人员这段代码到底是干什么的并且再三确认了通过-Xmx参数给JVM设置的堆大小之后,看样子问题确实是有点诡异了。
半小时后我们终于知道是怎么回事并解决了这个疑案。不过这个问题的确在一开始并不是那么明显,所以我想如果我把底层的问题描述得清楚点的话,或者以后能替大家节省掉一天的排查问题的时间。
通常来说,想弄清楚一个问题的最好方式就是通过一个实例来进行说明。这里我创建一个小的测试用例:
package eu.plumbr.demo ...
最近在办公室里,听见这么一段对话:
Bob: Alice,我看了下你昨天告诉我的那个慢查询,我已经把你想要的那个索引给加上去。现在肯定OK了。
Alice:谢谢你,Bob。我马上确认一下…不对啊,还是很慢,看起来没起作用啊
Bob:还真是。看起来Oracle没有用上这个索引,你那个查询我加了/*+INDEX(...)*/索引提示也不行。真是不知道怎么回事了。
然后,问题仍然没有解决。Alice很头疼,因为她要加的特性没有按时发现,Bob也很发愁,因为他觉得Oracle居然没有正常工作。
这是个真事。
Bob忘了Oralce和NULL值的问题了
可怜的Bob忘了,Oralce是不会 ...