`
deepinmind
  • 浏览: 452118 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
1dc14e59-7bdf-33ab-841a-02d087aed982
Java函数式编程
浏览量:41666
社区版块
存档分类
最新评论
文章列表
10年前我开始自己的职业生涯的时候,Struts还是市场上的主流标准。然而多年过后,我发现Spring MVC已经越来越流行了。对我而言这并不意外,因为它能和Spring容器无缝集成,同时它还提供了灵活性及扩展性。 从我迄今为止对Spring的经验来看,我发现有不少人在配置Spring的时候经常会犯一些常见的错误。跟使用Struts框架相比,这些错误要出现得更频繁一些。我猜想这可能是它在可用性和灵活性之间做出的权衡。不仅如此,Spring的文档中全是例子但缺少解释。为了填充这一空白,本文准备深入阐述三个大家常犯的错误。 在Servlet上下文定义文件中声明bean 我们都知道,Sprin ...
在本系列的第一篇文章中,我们介绍了Java的强类型及动态类型系统 。结论就是这个类型系统让你可以写出表述性强,健壮的应用程序,但是它限制了框架API与用户类型协作的能力。我们还知道了为什么Java的反射API并不总是与用户类型交互的最佳方式。为了将这点解释清楚,我们还分析了一个简单的安全库的实现,它使用了反射API,但却破坏了类型安全,为了保留用户类型,我们使用了代码生成的方式。 在文章的第二部分,我们分析了不同的代码生成库,并重点介绍了一下我自己开发的一个库,Byte Buddy。然后我们基于这个库来实现了一个简单的安全框架。 本文是最后一篇,我们想比较一下不同的库实现之间的性能差别。 ...
性能是个很复杂的问题,尤其是当你意识到程序在编译阶段会经历多次重写的时候。首先,你的源码会被翻译成字节码,然后再被进一步编译成机器代码,有时候甚至是多次编译。 有时候你的程序运行得并不是很快。之后你就会抱怨你的平台或者工具,并且考虑用C或者什么奇怪的方式来重写系统中的关键部分。然而,在你开始这个黑暗过程之前,请先再看看:还有一些工具是能让你在享受着JVM便利的同时还把问题解决掉的。 如果充分发挥你对JVM内部以及JIT工作原理的知识,你可以优化你的程序让它执行得更快一些。但今天我们要讲的并不是这些优化本身。如果你对这些东西更感兴趣的话,可以看一个例子,”HikariCP是如何优化的“。我 ...
一个优秀的程序员是如何炼成的?问一下自己这个问题会很有意思。这能让你好好思考一下软件开发的过程。拿它来问一下同事也不错,这能引起一些关于如何一起协作的很有意思的讨论。下面是我认为成为一名优秀的程序员所 ...
Java 8是极好的。不过我们在尝完鲜了之后,也开始对它持怀疑的态度。所有好的东西都是有代价的,在这篇文章中,我会分享Java 8的主要的几个难点。在你放弃Java 7升级到8之前,你最好确保自己知道这些。 1. 并行流会影响性能 Java 8的所承诺的并行处理是最受期待的新特性之一。集合以及流上的.parallelStream()方法就是实现这点的。它将问题分解成子问题,然后分别运行在不同的线程上,它们可能会被分配到不同的CPU核上,当完成之后再组合起来。这些全都是在底层通过fork/join框架来实现的。好的,听起来很酷吧,在多核环境下的大数据集上,这么做肯定能提升操作速度的,对吧? ...
上周我们探索了下Java的强类型及静态类型系统。我承认这样的类型让我们的代码表达性更强,但是同时也限制了第三方库提供面向POJO的API的能力。 我们明白了Java的反射的确是一种和用户代码交互的不错方式,但是这样损失了 ...
所有的编程语言我都讨厌。曾经我想自创一门语言,但我没搞明白到底需要一门什么语言,所以也从未开始过。 许多时候,你没法选择使用哪种语言。不管我在用哪种语言,我都尝试去接受它的优点和缺点。 Java 喜欢Java的人肯 ...
当你在开发应用的时候,大多数时候你都在写一些处理资源的代码。那些打开数据库连接,分配内存之类的代码。更底层的就是和计算环境打交道的代码了。这些代码很恶心,尽管有些程序员特别好这一口,但怎么说,这种代码自然是越少越好。真正能产生商业价值的是那些处理业务逻辑的代码。当然,很明显你也不可能只写业务代码对吧。还有一类代码是用来运行这些业务代码的,当然了,基础架构和业务的代码的边界并不是那么清晰。你很难跟别人说这些是业务代码,那些是基础设施的代码。 你能做的就是选择一个适合业务场景的框架。那些比较容易配置,不需要大量模板代码,容易学习的框架。这样的话你可以更聚焦于业务代码。当然了,知易行难。现在项目还有 ...
我是一个极简主义者,我不喜欢过早或者没必要地让软件复杂化。而往软件系统中添加组件就是严重增加复杂性的一种做法。我们来拿消息队列举个例子。 消息队列是一个能让你获得容错性,分布式,解耦等架构能力的系统。纸上谈兵的话,它看起来还不错。 或许消息列队在你的应用中有不少适用的场景。你可以看下这篇关于消息队列优点的文章,看看到底有哪些合适的场景。但可不要因为说"能解耦那太好了”就轻易使用它。我们来看一个例子——你希望你的邮件发送和订单处理互相解耦。因此你发送一个消息到消息队列里,然后邮件处理系统取出这个消息并发送邮件。那你在一个独立的单classpath的应用中怎么实现呢?让你的订单处理服务 ...
通过程序来生成代码是Java平台的固有特性。当Java程序编译的时候,Java编译器生成的是字节码而不是可执行程序。字节码是Java特有的格式,它本身并没有太大的用处。为了能执行字节码,它会在运行时被JVM的just-in-time编译器翻译成本地的机器代码。 Java的导论就先讲到这吧。大多数Java开发人员应该都听说过JIT编译,但它作为这个平台最强大的功能之一,即便你不了解它的细节,也不影响你正常写你的Java程序。 然而随着POJO革命的进行,Java领域流行起了另一种代码生成的形式。许多现代的Java库和框架都在Java程序运行时通过定义自己的类来实现了很多技巧。 乍一听,这个很 ...
帕雷托法则说80%的成果取决于20%的原因。这也被称为28原则,人类几乎每一个领域的尝试都和它有关。 在软件开发领域,这个原则可以总结为大多数问题都是由少数的糟糕的编码实践导致的。消除这些问题,你的工作会变得更轻松,效率也会得到提升 . 代码拼写错误 令人惊讶的是,这是最常见的,由于它和你的编码水平高低没有关系,因此很让人抓狂。变量名或者函数名的一个拼写错误就会给你的代码造成严重的破坏。更严重的是,它们通常不易察觉。 那怎么解决?在一个好的IDE或者程序员专用的文本编辑中工作可以显著地减少拼写错误的问题。还可以做的一件事情是:尽量选择容易拼写的变量或函数名,这样当写错的时候就很容易 ...
你或许也知道,正是JVM( Java Virtusal Machine,Java虚拟机)使得Java成为遵循“一次编写,处处运行”的范例。JVM包括如下核心组件: 堆 栈 持久代及方法区 JIT编译器 代码缓存 堆是你的应用程序代码中new操作符分配内存的地方。 ...
假设我们有许多命令。为了本文叙述起来简单些,我们将这些命令全都实现成一个类中的方法。通过字符串名可以调用到对应的命令。方法调用是大小写不敏感的。这个“命令类”看起来会是这样的: public class ObjectWithCommands { public Object Command1( final Object arg ) { return arg; } public Object Command2( final Object arg ) { return arg; } ... public Object Command9( final ...
面向对象设计中的单一职责原则强调的是不要给一个类赋予太多职责的重要性。 “开发一个满足规范的软件就跟走在水面上一样,除非是结了冰才行(或者需求冻结不变了)”——Edward V. Berard。 我们都清楚,软件开发的规格 ...
lambda表达式 语法 最常用的: Runnable runnable = () -> System.out.println("Hello!"); Thread t = new Thread(runnable); t.start(); t.join(); 你还可以这么写: Thread t = new Thread(() -> System.out.println("Hello!")); t.start(); t.join(); 带有参数的呢? Comparato ...
Global site tag (gtag.js) - Google Analytics