先通過isExist函數判斷,該long值,是否存在,如果存在, 那么進入循環體,重新給一個long值.
創新互聯公司是一家朝氣蓬勃的網站建設公司。公司專注于為企業提供信息化建設解決方案。從事網站開發,網站制作,網站設計,網站模板,微信公眾號開發,軟件開發,微信平臺小程序開發,十載建站對木包裝箱等多個領域,擁有豐富設計經驗。
目的就是需要的long值不重復.
參考代碼
import?java.util.ArrayList;
import?java.util.Random;
public?class?DD?{
private?static?ArrayListLong?list;//存放數字的list
public?static?void?main(String[]?args)?{
list?=?new?ArrayListLong();
Random?random?=?new?Random();
for?(int?i?=?0;?i??5;?i++)?{//外循環5次,添加5個數字到集合里
long?token;
while?(isExist(token?=?random.nextInt(5)))?{//為了能看到效果,所以把nextLong,換成了nexInt(5),縮小隨即的范圍.讓他們重復,然后重新賦值
System.out.println("隨即數"+token+"已經有了,重新賦值");
token?=?random.nextInt(5);
}
list.add(token);
}
System.out.println(list);
}
private?static?boolean?isExist(long?lg)?{
return?list.contains(lg);
}
}
測試結果
隨即數3已經有了,重新賦值
隨即數2已經有了,重新賦值
隨即數1已經有了,重新賦值
隨即數3已經有了,重新賦值
[1,?0,?3,?2,?4]
Bazel:來自Google的構建工具,可以快速、可靠地構建代碼。官網
Gradle:使用Groovy(非XML)進行增量構建,可以很好地與Maven依賴管理配合工作。官網
Buck:Facebook構建工具。官網
字節碼操作
編程方式操作字節碼的開發庫。
ASM:通用底層字節碼操作和分析開發庫。官網
Byte Buddy:使用流式API進一步簡化字節碼生成。官網
Byteman:在運行時通過DSL(規則)操作字節碼進行測試和故障排除。官網
Javassist:一個簡化字節碼編輯嘗試。官網
集群管理
在集群內動態管理應用程序的框架。
Apache Aurora:Apache Aurora是一個Mesos框架,用于長時間運行服務和定時任務(cron job)。官網
Singularity:Singularity是一個Mesos框架,方便部署和操作。它支持Web Service、后臺運行、調度作業和一次性任務。官網
代碼分析
測量代碼指標和質量工具。
Checkstyle:代碼編寫規范和標準靜態分析工具。官網
Error Prone:將常見編程錯誤作為運行時錯誤報告。官網
FindBugs:通過字節碼靜態分析查找隱藏bug。官網
jQAssistant:使用基于Neo4J查詢語言進行代碼靜態分析。官網
PMD:對源代碼分析查找不良的編程習慣。官網
SonarQube:通過插件集成其它分析組件,對過去一段時間內的數據進行統計。官網
編譯器生成工具
用來創建解析器、解釋器或編譯器的框架。
ANTLR:復雜的全功能自頂向下解析框架。官網
JavaCC:JavaCC是更加專門的輕量級工具,易于上手且支持語法超前預測。官網
外部配置工具
支持外部配置的開發庫。
config:針對JVM語言的配置庫。官網
owner:減少冗余配置屬性。官網
約束滿足問題求解程序
幫助解決約束滿足問題的開發庫。
Choco:可直接使用的約束滿足問題求解程序,使用了約束規劃技術。官網
JaCoP:為FlatZinc語言提供了一個接口,可以執行MiniZinc模型。官網
OptaPlanner:企業規劃與資源調度優化求解程序。官網
Sat4J:邏輯代數與優化問題最先進的求解程序。官網
持續集成
Bamboo:Atlassian解決方案,可以很好地集成Atlassian的其他產品。可以選擇開源許可,也可以購買商業版。官網
CircleCI:提供托管服務,可以免費試用。官網
Codeship:提供托管服務,提供有限的免費模式。官網
fabric8:容器集成平臺。官網
Go:ThoughtWork開源解決方案。官網
Jenkins:支持基于服務器的部署服務。官網
TeamCity:JetBrain的持續集成解決方案,有免費版。官網
Travis:通常用作開源項目的托管服務。官網
Buildkite: 持續集成工具,用簡單的腳本就能設置pipeline,而且能快速構建,可以免費試用。官網
CSV解析
簡化CSV數據讀寫的框架與開發庫
uniVocity-parsers:速度最快功能最全的CSV開發庫之一,同時支持TSV與固定寬度記錄的讀寫。官網
數據庫
簡化數據庫交互的相關工具。
Apache Phoenix:HBase針對低延時應用程序的高性能關系數據庫層。官網
Crate:實現了數據同步、分片、縮放、復制的分布式數據存儲。除此之外還可以使用基于SQL的語法跨集群查詢。官網
Flyway:簡單的數據庫遷移工具。官網
H2:小型SQL數據庫,以可以作為內存數據庫使用著稱。官網
HikariCP:高性能JDBC連接工具。官網
JDBI:便捷的JDBC抽象。官網
Protobuf:Google數據交換格式。官網
SBE:簡單二進制編碼,是最快速的消息格式之一。官網
Wire:整潔輕量級協議緩存。官網
幫實現依賴翻轉范式的開發庫。?官網
Apache DeltaSpike:CDI擴展框架。官網
Dagger2:編譯時注入框架,不需要使用反射。官網
Guice:可以匹敵Dagger的輕量級注入框架。官網
HK2:輕量級動態依賴注入框架。官網
開發流程增強工具
從最基本的層面增強開發流程。
ADT4J:針對代數數據類型的JSR-269代碼生成器。官網
AspectJ:面向切面編程(AOP)的無縫擴展。官網
Auto:源代碼生成器集合。官網
DCEVM:通過修改JVM在運行時支持對已加載的類進行無限次重定義。官網
HotswapAgent:支持無限次重定義運行時類與資源。官網
Immutables:類似Scala的條件類。官網
JHipster:基于Spring Boot與AngularJS應用程序的Yeoman源代碼生成器。官網
JRebel:無需重新部署,可以即時重新加載代碼與配置的商業軟件。官網
Lombok:減少冗余的代碼生成器。官網
Spring Loaded:類重載代理。官網
vert.x:多語言事件驅動應用框架。官網
分布式應用
用來編寫分布式容錯應用的開發庫和框架。
Akka:用來編寫分布式容錯并發事件驅動應用程序的工具和運行時。官網
Apache Storm:實時計算系統。官網
Apache ZooKeeper:針對大型分布式系統的協調服務,支持分布式配置、同步和名稱注冊。官網
Hazelcast:高可擴展內存數據網格。官網
Hystrix:提供延遲和容錯。官網
JGroups:提供可靠的消息傳遞和集群創建的工具。官網
Orbit:支持虛擬角色(Actor),在傳統角色的基礎上增加了另外一層抽象。官網
Quasar:為JVM提供輕量級線程和角色。官網
分布式數據庫
對應用程序而言,在分布式系統中的數據庫看起來就像是只有一個數據源。
Apache Cassandra:列式數據庫,可用性高且沒有單點故障。官網
Apache HBase:針對大數據的Hadoop數據庫。官網
Druid:實時和歷史OLAP數據存儲,在聚集查詢和近似查詢方面表現不俗。官網
Infinispan:針對緩存的高并發鍵值對數據存儲。官網
發布
以本機格式發布應用程序的工具。
Bintray:發布二進制文件版本控制工具。可以于Maven或Gradle一起配合使用。提供開源免費版本和幾種商業收費版本。官網
Central Repository:最大的二進制組件倉庫,面向開源社區提供免費服務。Apache Maven默認使用Central?官網Repository,也可以在所有其他構建工具中使用。
IzPack:為跨平臺部署建立創作工具(Authoring Tool)。官網
JitPack:打包GitHub倉庫的便捷工具。可根據需要構建Maven、Gradle項目,發布可立即使用的組件。官網
Launch4j:將JAR包裝為輕量級本機Windows可執行程序。官網
Nexus:支持代理和緩存功能的二進制管理工具。官網
packr:將JAR、資源和JVM打包成Windows、Linux和Mac OS X本地發布文件。官網
文檔處理工具
處理Office文檔的開發庫。
Apache POI:支持OOXML規范(XLSX、DOCX、PPTX)以及OLE2規范(XLS、DOC、PPT)。官網
documents4j:使用第三方轉換器進行文檔格式轉換,轉成類似MS Word這樣的格式。官網
jOpenDocument:處理OpenDocument格式(由Sun公司提出基于XML的文檔格式)。官網
函數式編程
函數式編程支持庫。
Cyclops:支持一元(Monad)操作和流操作工具類、comprehension(List語法)、模式匹配、trampoline等特性。官網
Fugue:Guava的函數式編程擴展。官網
Functional Java:實現了多種基礎和高級編程抽象,用來輔助面向組合開發(composition-oriented development)。官網
Javaslang:一個函數式組件庫,提供持久化數據類型和函數式控制結構。官網
jOOλ:旨在填補Java 8 lambda差距的擴展,提供了眾多缺失的類型和一組豐富的順序流API。官網
游戲開發
游戲開發框架。
jMonkeyEngine:現代3D游戲開發引擎。官網
libGDX:全面的跨平臺高級框架。官網
LWJGL:對OpenGL/CL/AL等技術進行抽象的健壯框架。官網
GUI
現代圖形化用戶界面開發庫。
JavaFX:Swing的后繼者。官網
Scene Builder:開發JavaFX應用的可視化布局工具。官網
高性能計算
涵蓋了從集合到特定開發庫的高性能計算相關工具。
Agrona:高性能應用中常見的數據結構和工具方法。官網
Disruptor:線程間消息傳遞開發庫。官網
fastutil:快速緊湊的特定類型集合(Collection)。官網
GS Collections:受Smalltalk啟發的集合框架。官網
HPPC:基礎類型集合。官網
Javolution:實時和嵌入式系統的開發庫。官網
JCTools:JDK中缺失的并發工具。官網
Koloboke:Hash set和hash map。官網
Trove:基礎類型集合。官網
High-scale-bli:Cliff Click 個人開發的高性能并發庫官網
IDE
簡化開發的集成開發環境。
Eclipse:老牌開源項目,支持多種插件和編程語言。官網
IntelliJ IDEA:支持眾多JVM語言,是安卓開發者好的選擇。商業版主要針對企業客戶。官網
NetBeans:為多種技術提供集成化支持,包括Java SE、Java EE、數據庫訪問、HTML5
Imgscalr:純Java 2D實現,簡單、高效、支持硬件加速的圖像縮放開發庫。官網
Picasso:安卓圖片下載和圖片緩存開發庫。官網
Thumbnailator:Thumbnailator是一個高質量Java縮略圖開發庫。官網
ZXing:支持多種格式的一維、二維條形碼圖片處理開發庫。官網
im4java: 基于ImageMagick或GraphicsMagick命令行的圖片處理開發庫,基本上ImageMagick能夠支持的圖片格式和處理方式都能夠處理。官網
Apache Batik:在Java應用中程序以SVG格式顯示、生成及處理圖像的工具集,包括SVG解析器、SVG生成器、SVG DOM等模塊,可以集成使用也可以單獨使用,還可以擴展自定義的SVG標簽。官網
JSON
簡化JSON處理的開發庫。
Genson:強大且易于使用的Java到JSON轉換開發庫。官網
Gson:谷歌官方推出的JSON處理庫,支持在對象與JSON之間雙向序列化,性能良好且可以實時調用。官網
Jackson:與GSON類似,在頻繁使用時性能更佳。官網
LoganSquare:基于Jackson流式API,提供對JSON解析和序列化。比GSON與Jackson組合方式效果更好。官網
Fastjson:一個Java語言編寫的高性能功能完善的JSON庫。官網
Kyro:快速、高效、自動化的Java對象序列化和克隆庫。官網
JVM與JDK
目前的JVM和JDK實現。
JDK 9:JDK 9的早期訪問版本。官網
OpenJDK:JDK開源實現。官網
基于JVM的語言
除Java外,可以用來編寫JVM應用程序的編程語言。
Scala:融合了面向對象和函數式編程思想的靜態類型編程語言。官網
Groovy:類型可選(Optionally typed)的動態語言,支持靜態類型和靜態編譯。目前是一個Apache孵化器項目。官網
Clojure:可看做現代版Lisp的動態類型語言。官網
Ceylon:RedHat開發的面向對象靜態類型編程語言。官網
Kotlin:JetBrain針對JVM、安卓和瀏覽器提供的靜態類型編程語言。官網
Xtend:一種靜態編程語言,能夠將其代碼轉換為簡潔高效的Java代碼,并基于JVM運行。官網
日志
記錄應用程序行為日志的開發庫。
Apache Log4j 2:使用強大的插件和配置架構進行完全重寫。官網
kibana:分析及可視化日志文件。官網
Logback:強健的日期開發庫,通過Groovy提供很多有趣的選項。官網
logstash:日志文件管理工具。官網
Metrics:通過JMX或HTTP發布參數,并且支持存儲到數據庫。官網
SLF4J:日志抽象層,需要與具體的實現配合使用。官網
機器學習
提供具體統計算法的工具。其算法可從數據中學習。
Apache Flink:快速、可靠的大規模數據處理引擎。官網
Apache Hadoop:在商用硬件集群上用來進行大規模數據存儲的開源軟件框架。官網
Apache Mahout:專注協同過濾、聚類和分類的可擴展算法。官網
Apache Spark:開源數據分析集群計算框架。官網
DeepDive:從非結構化數據建立結構化信息并集成到已有數據庫的工具。官網
Deeplearning4j:分布式多線程深度學習開發庫。官網
H2O:用作大數據統計的分析引擎。官網
Weka:用作數據挖掘的算法集合,包括從預處理到可視化的各個層次。官網
QuickML:高效機器學習庫。官網、GitHub
消息傳遞
在客戶端之間進行消息傳遞,確保協議獨立性的工具。
Aeron:高效可擴展的單播、多播消息傳遞工具。官網
Apache ActiveMQ:實現JMS的開源消息代理(broker),可將同步通訊轉為異步通訊。官網
Apache Camel:通過企業級整合模式(Enterprise Integration Pattern EIP)將不同的消息傳輸API整合在一起。官網
Apache Kafka:高吞吐量分布式消息系統。官網
Hermes:快速、可靠的消息代理(Broker),基于Kafka構建。官網
JBoss HornetQ:清晰、準確、模塊化,可以方便嵌入的消息工具。官網
JeroMQ:ZeroMQ的純Java實現。官網
Smack:跨平臺XMPP客戶端函數庫。官網
Openfire:是開源的、基于XMPP、采用Java編程語言開發的實時協作服務器。 Openfire安裝和使用都非常簡單,并可利用Web界面進行管理。?官網GitHub
Spark:是一個開源,跨平臺IM客戶端。它的特性支持集組聊天,電話集成和強大安全性能。如果企業內部部署IM使用Openfire+Spark是最佳的組合。?官網?GitHub
Tigase: 是一個輕量級的可伸縮的 Jabber/XMPP 服務器。無需其他第三方庫支持,可以處理非常高的復雜和大量的用戶數,可以根據需要進行水平擴展。?官網
雜項
未分類其它資源。
Design Patterns:實現并解釋了最常見的設計模式。官網
Jimfs:內存文件系統。官網
Lanterna:類似curses的簡單console文本GUI函數庫。官網
LightAdmin:可插入式CRUD UI函數庫,可用來快速應用開發。官網
OpenRefine:用來處理混亂數據的工具,包括清理、轉換、使用Web Service進行擴展并將其關聯到數據庫。官網
RoboVM:Java編寫原生iOS應用。官網
Quartz:強大的任務調度庫.官網
應用監控工具
監控生產環境中應用程序的工具。
AppDynamics:性能監測商業工具。官網
JavaMelody:性能監測和分析工具。官網
Kamon:Kamon用來監測在JVM上運行的應用程序。官網
New Relic:性能監測商業工具。官網
SPM:支持對JVM應用程序進行分布式事務追蹤的性能監測商業工具。官網
Takipi:產品運行時錯誤監測及調試商業工具。官網
原生開發庫
用來進行特定平臺開發的原生開發庫。
JNA:不使用JNI就可以使用原生開發庫。此外,還為常見系統函數提供了接口。官網
自然語言處理
用來專門處理文本的函數庫。
Apache OpenNLP:處理類似分詞等常見任務的工具。官網
CoreNLP:斯坦佛CoreNLP提供了一組基礎工具,可以處理類似標簽、實體名識別和情感分析這樣的任務。官網
LingPipe:一組可以處理各種任務的工具集,支持POS標簽、情感分析等。官網
Mallet:統計學自然語言處理、文檔分類、聚類、主題建模等。官網
網絡
網絡編程函數庫。
Async Http Client:異步HTTP和WebSocket客戶端函數庫。官網
Grizzly:NIO框架,在Glassfish中作為網絡層使用。官網
Netty:構建高性能網絡應用程序開發框架。官網
OkHttp:一個Android和Java應用的HTTP+SPDY客戶端。官網
Undertow:基于NIO實現了阻塞和非阻塞API的Web服務器,在WildFly中作為網絡層使用。官網
ORM
處理對象持久化的API。
Ebean:支持快速數據訪問和編碼的ORM框架。官網
EclipseLink:支持許多持久化標準,JPA、JAXB、JCA和SDO。官網
Hibernate:廣泛使用、強健的持久化框架。Hibernate的技術社區非常活躍。官網
MyBatis:帶有存儲過程或者SQL語句的耦合對象(Couples object)。官網
OrmLite:輕量級開發包,免除了其它ORM產品中的復雜性和開銷。官網
Nutz:另一個SSH。官網,Github
JFinal:JAVA WEB + ORM框架。官網,Github
用來幫助創建PDF文件的資源。
Apache FOP:從XSL-FO創建PDF。官網
Apache PDFBox:用來創建和操作PDF的工具集。官網
DynamicReports:JasperReports的精簡版。官網
flyingsaucer:XML/XHTML和CSS 2.1渲染器。官網
iText:一個易于使用的PDF函數庫,用來編程創建PDF文件。注意,用于商業用途時需要許可證。官網
JasperReports:一個復雜的報表引擎。官網
性能分析
性能分析、性能剖析及基準測試工具。
jHiccup:提供平臺中JVM暫停的日志和記錄。官網
JMH:JVM基準測試工具。官網
JProfiler:商業分析器。官網
LatencyUtils:測量和報告延遲的工具。官網
VisualVM:對運行中的應用程序信息提供了可視化界面。官網
YourKit Java Profiler:商業分析器。官網
響應式開發庫
用來開發響應式應用程序的開發庫。
Reactive Streams:異步流處理標準,支持非阻塞式反向壓力(backpressure)。官網
Reactor:構建響應式快速數據(fast-data)應用程序的開發庫。官網
RxJava:通過JVM可觀察序列(observable sequence)構建異步和基于事件的程序。官網
REST框架
用來創建RESTful 服務的框架。
Dropwizard:偏向于自己使用的Web框架。用來構建Web應用程序,使用了Jetty、Jackson、Jersey和Metrics。官網
Feign:受Retrofit、JAXRS-2.0和WebSocket啟發的HTTP客戶端連接器(binder)。官網
Jersey:JAX-RS參考實現。官網
RESTEasy:經過JAX-RS規范完全認證的可移植實現。官網
RestExpress:一個Java類型安全的REST客戶端。官網
RestX:基于注解處理和編譯時源碼生成的框架。官網
Retrofit:類型安全的REST客戶端。官網
Spark:受到Sinatra啟發的Java REST框架。官網
Swagger:Swagger是一個規范且完整的框架,提供描述、生產、消費和可視化RESTful Web Service。官網
Blade:國人開發的一個輕量級的MVC框架. 它擁有簡潔的代碼,優雅的設計。官網
科學計算與分析
用于科學計算和分析的函數庫。
DataMelt:用于科學計算、數據分析及數據可視化的開發環境。官網
JGraphT:支持數學圖論對象和算法的圖形庫。官網
JScience:用來進行科學測量和單位的一組類。官網
搜索引擎
文檔索引引擎,用于搜索和分析。
Apache Solr:一個完全的企業搜索引擎。為高吞吐量通信進行了優化。官網
Elasticsearch:一個分布式、支持多租戶(multitenant)全文本搜索引擎。提供了RESTful Web接口和無schema的JSON文檔。官網
Apache Lucene:是一個開放源代碼的全文檢索引擎工具包,是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎。官網
安全
用于處理安全、認證、授權或會話管理的函數庫。
Apache Shiro:執行認證、授權、加密和會話管理。官網
Bouncy Castle,涵蓋了從基礎的幫助函數到PGP/SMIME操作。官網:多途加密開發庫。支持JCA提供者(JCA provider)
Cryptomator:在云上進行客戶端跨平臺透明加密。官網
Keycloak:為瀏覽器應用和RESTful Web Service集成SSO和IDM。目前還處于beta版本,但是看起來非常有前途。官網
PicketLink:PicketLink是一個針對Java應用進行安全和身份認證管理的大型項目(Umbrella Project)。官網
序列化
用來高效處理序列化的函數庫。
FlatBuffers:高效利用內存的序列化函數庫,無需解包和解析即可高效訪問序列化數據。官網
Kryo:快速、高效的對象圖形序列化框架。官網
FST:提供兼容JDK的高性能對象圖形序列化。官網
MessagePack:一種高效的二進制序列化格式。官網
應用服務器
用來部署應用程序的服務器。
Apache Tomcat:針對Servlet和JSP的應用服務器,健壯性好且適用性強。官網
Apache TomEE:Tomcat加Java EE。官網
Jetty:輕量級、小巧的應用服務器,通常會嵌入到項目中。官網
WebSphere Liberty:輕量級、模塊化應用服務器,由IBM開發。官網
WildFly:之前被稱作JBoss,由Red Hat開發。支持很多Java EE功能。官網
模板引擎
在模板中替換表達式的工具。
Apache Velocity:提供HTML頁面模板、email模板和通用開源代碼生成器模板。官網
FreeMarker:通用模板引擎,不需要任何重量級或自己使用的依賴關系。官網
Handlebars.java:使用Java編寫的模板引擎,邏輯簡單,支持語義擴展(semantic Mustache)。官網
Thymeleaf:旨在替換JSP,支持XML文件的工具。官網
測試
測試內容從對象到接口,涵蓋性能測試和基準測試工具。
Apache JMeter:功能性測試和性能評測。官網
Arquillian:集成測試和功能行測試平臺,集成Java EE容器。官網
AssertJ:支持流式斷言提高測試的可讀性。官網
Awaitility:用來同步異步操作的DSL。官網
Cucumber:BDD測試框架。官網
Gatling:設計為易于使用、可維護的和高性能負載測試工具。官網
Hamcrest:可用來靈活創建意圖(intent)表達式的匹配器。官網
JMockit:用來模擬靜態、final方法等。官網
JUnit:通用測試框架。官網
Mockito:在自動化單元測試中創建測試對象,為TDD或BDD提供支持。官網
PowerMock: 支持模擬靜態方法、構造函數、final類和方法、私有方法以及移除靜態初始化器的模擬工具。官網
REST Assured:為REST/HTTP服務提供方便測試的Java DSL。官網
Selenide:為Selenium提供精準的周邊API,用來編寫穩定且可讀的UI測試。官網
Selenium:為Web應用程序提供可移植軟件測試框架。官網
Spock:JUnit-compatible framework featuring an expressive Groovy-derived specification language.官網兼容JUnit框架,支持衍生的Groovy范的語言。
TestNG:測試框架。官網
Truth:Google的斷言和命題(proposition)框架。官網
Unitils:模塊化測試函數庫,支持單元測試和集成測試。官網
WireMock:Web Service測試樁(Stub)和模擬函數。官網
通用工具庫
通用工具類函數庫。
Apache Commons:提供各種用途的函數,比如配置、驗證、集合、文件上傳或XML處理等。官網
args4j:命令行參數解析器。官網
CRaSH:為運行進行提供CLI。官網
Gephi:可視化跨平臺網絡圖形化操作程序。官網
Guava:集合、緩存、支持基本類型、并發函數庫、通用注解、字符串處理、I/O等。官網
JADE:構建、調試多租戶系統的框架和環境。官網
javatuples:正如名字表示的那樣,提供tuple支持。盡管目前tuple的概念還有留有爭議。官網
JCommander:命令行參數解析器。官網
Protégé:提供存在論(ontology)編輯器以及構建知識系統的框架。官網
網絡爬蟲
用于分析網站內容的函數庫。
Apache Nutch:可用于生產環境的高度可擴展、可伸縮的網絡爬蟲。官網
Crawler4j:簡單的輕量級網絡爬蟲。官網
JSoup:刮取、解析、操作和清理HTML。官網
Web框架
用于處理Web應用程序不同層次間通訊的框架。
Apache Tapestry:基于組件的框架,使用Java創建動態、強健的、高度可擴展的Web應用程序。官網
Apache Wicket:基于組件的Web應用框架,與Tapestry類似帶有狀態顯示GUI。官網
Google Web Toolkit:一組Web開發工具集,包含在客戶端將Java代碼轉為JavaScript的編譯器、XML解析器、RCP?官網API、JUnit集成、國際化支持和GUI控件。
Grails:Groovy框架,旨在提供一個高效開發環境,使用約定而非配置、沒有XML并支持混入(mixin)。官網
Ninja:Java全棧Web開發框架。非常穩固、快速和高效。官網
Pippo:小型、高度模塊化的類Sinatra框架。官網
Play:使用約定而非配置,支持代碼熱加載并在瀏覽器中顯示錯誤。官網
PrimeFaces:JSF框架,提供免費和帶支持的商業版本。包括若干前端組件。官網
Ratpack:一組Java開發函數庫,用于構建快速、高效、可擴展且測試完備的HTTP應用程序。官網
Spring Boot:微框架,簡化了Spring新程序的開發過程。官網
Spring:旨在簡化Java EE的開發過程,提供依賴注入相關組件并支持面向切面編程。官網
Vaadin:基于GWT構建的事件驅動框架。使用服務端架構,客戶端使用Ajax。官網
Blade:國人開發的一個輕量級的MVC框架. 它擁有簡潔的代碼,優雅的設計。官網
業務流程管理套件
流程驅動的軟件系統構建。
jBPM:非常靈活的業務流程管理框架,致力于構建開發與業務分析人員之間的橋梁。官網
Activity:輕量級工作流和業務流程管理框架。官網?github
資源
社區
1. 優雅需要付出代價。
從短期利益來看,對某個問題提出優雅的解決方法,似乎可能花你更多的時間。但當它終于能夠正確執行并可輕易套用于新案例中,不需要花上數以時計,甚至以天計或以月計的辛苦代價時,你會看得到先前所花功夫的回報(即使沒有人可以衡量這一點)。這不僅給你一個可更容易開發和調試的程序,也更易于理解和維護。這正是它在金錢上的價值所在。這一點有賴某種人生經驗才能夠了解,因為當你努力讓某一段程序代碼變得比較優雅時,你并不是處于一種具生產力的狀態下。但是,請抗拒那些催促你趕工的人們,因為那么做只會減緩你的速度罷了。
2. 先求能動,再求快。
即使你已確定某段程序代碼極為重要,而且是系統的重要瓶頸,這個準則依然成立。盡可能簡化設計,讓系統能夠先正確動作。如果程序的執行不夠快,再量測其效能。幾乎你總是會發現,你所認為的”瓶頸”其實都不是問題所在。把你的時間花在刀口上吧。
3. 記住”各個擊破”的原理。
如果你所探討的問題過于混雜,試著想像該問題的基本動作會是什么,并假設這一小塊東西能夠神奇地處理掉最難的部分。這”一小塊”東西其實就是對象–請撰寫運用該對象的程序代碼,然后檢視對象,并將其中困難的部分再包裝成其他對象,依此類推。
4. 區分class開發者和class使用者(使用端程序員)。
Class 使用者扮演著”客戶”角色,不需要(也不知道)class的底層運作方式。Class開發者必須是class設計專家,并撰寫class,使它能夠盡可能被大多數新手程序員所用,而且在程序中能夠穩當執行。一套程序庫只有在具備通透性的情況下,使用起來才會容易。
5.當你撰寫class時,試著給予明了易懂的名稱,減少不必要的注解。
你給客戶端程序員的接口,應該保持概念上的單純性。不了這個目的,當函數的重載(overloading)適合制作出直覺、易用的接口時,請善加使用。
6. 也必你的分析和設計必須讓系統中的classes保持最少,須讓其Public interfaces保持最少,以及讓這些classes和其他classes之間的關聯性( 尤其是base classes)保持最少。
如果你的設計所得結果更甚于此,請問問自己,是否其中每一樣東西在整個程序生命期中都饒富價值?如果并非如此,那么,維護它們會使你付出代價。開發團隊的成員都有不維護”無益于生產力提升”的任何東西的傾向;這是許多設計方法無法解釋的現象。
7. 讓所有東西盡量自動化。先撰寫測試用的程序代碼(在你撰寫class之前),并讓它和class結合在一起。請使用makefile或類似工具,自動進行測試動作。
通過這種方式,只要執行測試程序,所有的程序變動就可以自動獲得驗證,而且可以立即發現錯誤。由于你知道的測試架構所具備的安全性,所以當你發現新的需求時,你會更勇于進行全面修改。請記住,程序語言最大的改進,是來自型別檢查、異常處理等機制所賦予的內置測試動作。但這些功能只能協助你到達某種程度。開發一個穩固系統時,你得自己驗證自己的classes或程序的性質。
8. 在你撰寫class之前先寫測試碼,以便驗證你的class 是否設計完備。如果你無法撰寫測試碼,你便無法知道你的class 的可能長相。撰寫測試碼通常能夠顯現出額外的特性(features)或限制 ( constraints)__它們并不一定總是能夠在分析和設計過程中出現。測試碼也可做為展示class 用法的示例程序。
9. 所有軟件設計上的問題,都可以通過”引入額外的概念性間接層(conceptual indirection)”加以簡化。這個軟件工程上的基礎法則是抽象化概念的根據,而抽象化概念正是面向對象程序設計的主要性質。
10. 間接層(indirection)應該要有意義(和準則-9致)。
這里所指的意義可以像”將共用程序代碼置于惟一函數”這么簡單。如果你加入的間接層(或抽象化、或封裝等等)不具意義,它可能就和沒有適當的間接層一樣糟糕。
11. 讓class盡可能微小而無法切割(atomic)。
賦予每個class單一而清楚的用途。如果你的classes或你的系統成長得過于復雜,請將復雜的classes切割成比較簡單的幾個classes。最明顯的一個判斷指針就是class的大小:如果它很大,那么它工作量過多的機會就可能很高,那就應該被切割。重新設計class的建議線索是:
1) 復雜的switch語句:請考慮運用多態(Polymorphism)。
2) 許多函數各自處理類型極為不同的動作:請考慮切割為多個不同的(classes)。
12. 小心冗長的引數列(argument lists)。
冗長的引數列會使函數的調用動作不易撰寫、閱讀、維護。你應該試著將函數搬移到更適當的class中,并盡量以對象為引數。
13. 不要一再重復。
如果某段程序代碼不斷出現于許多derived class函數中,請將該段程序代碼置于某個base class 函數內,然后在derived class函數中調用。這么做不僅可以省下程序代碼空間,也可以讓修改該段程序代碼動作更易于進行。有時候找出此種共通程序代碼還可以為接口增加實用功能。
14. 小心switch語句或成串的if-else 子句。
通常這種情況代表所謂的”type-check coding”。也就是說究竟會執行哪一段程序代碼,乃是依據某種型別信息來做抉擇(最初,確切型別可能不十分明顯)。你通常可以使用繼承和多態來取代此類程序代碼;Polymorphical method (多態函數)的調用會自動執行此類型別檢驗,并提供更可靠更容易的擴充性。
15. 從設計觀點來看,請找出變動的事物,并使它和不變的事物分離。
也就是說,找出系統中可能被你改變的元素,將它們封裝于classes中。你可以在《Thinking in Patterns with Java》(可免費下載于 www. BruceEckel. Com)大量學習到這種觀念。
16. 不要利用subclassing來擴充基礎功能。
如果某個接口元素對class而言極重要,它應該被放在base class 里頭,而不是直到衍生(derivation)時才被加入。如果你在繼承過程中加入了函數,或許你應該重新思考整個設計。
17. 少就是多。
從class 的最小接口開始妨展,盡可能在解決問題的前提下讓它保持既小又單純。不要預先考量你的class被使用的所有可能方式。一旦class被實際運用,你自然會知道你得如何擴充接口。不過,一旦class被使用后,你就無法在不影響客戶程序代碼的情況下縮減其接口。如果你要加入更多函數倒是沒有問題–不會影響既有的客戶程序代碼,它們只需重新編譯即可。但即使新函數取代了舊函數的功能,也請你保留既有接口。如果你得通過”加入更多引數”的方式來擴充既有函數的接口,請你以新引數寫出一個重載化的函數;通過 這種方式就不會影響既有函數的任何客戶了。
18. 大聲念出你的classes,確認它們符合邏輯。
請base class和derived class 之間的關系是”is-a”(是一種),讓class和成員對象之間的關系是”has-a”(有一個)。
19. 當你猶豫不決于繼承(inheritance)或合成(組合,composition)時,請你問問自己,是否需要向上轉型(upcast)為基礎型別。
如果不需要,請優先選擇合成(也就是是使用成員對象)。這種作法可以消除”過多基礎型別”。如果你采用繼承,使用者會認為他們應該可以向上轉型。
20. 運用數據成員來表示數值的變化,運用經過覆寫的函數(overrided method)來代表行為的變化 。
也就是說,如果你找到了某個 class, 帶有一些狀態變量,而其函數會依據這些變量值切換不同的行為,那么你或許就應該重新設計,在subclasses 和覆寫后的函數(overrided methods)中展現行為止的差異。
21. 小心重載(overloading)。
函數不應該依據引數值條件式地選擇執行某一段程序代碼。這種情況下你應該撰寫兩個或更多個重載函數(overloaded methods)
22. 使用異常體系(exception hierarchies)
最好是從Java標準異常體系中衍生特定的classes, 那么,捕捉異常的人便可以捕捉特定異常,之后才捕捉基本異常。如果你加入新的衍生異常,原有的客戶端程序仍能通過其基礎型別來捕捉它。
23. 有時候簡單的聚合(aggregation)就夠了。
飛機上的”旅客舒適系統”包括數個分離的元素:座椅、空調、視訊設備等等,你會需要在飛機上產生許多這樣的東西。你會將它們聲明為Private成員并開發出一個全新的接口嗎?不會的,在這個例子中,元素也是Public接口的一部分,所以仍然是安全的。當然啦,簡單聚合并不是一個常被運用的解法,但有時候的確是。
24. 試著從客戶程序員和程序維護的角度思考。
你的class應該設計得盡可能容易使用。你應該預先考量可能性有的變動,并針對這些 可能的變動進行設計,使這些變動日后可輕易完成。
25. 小心”巨大對象并發癥”。
這往往是剛踏OOP領域的過程式(procedural)程序員的一個苦惱,因為他們往往最終還是寫出一個過程式程序,并將它們擺放到一個或兩個巨大對象中。注意,除了application framework (應用程序框架,譯注:一種很特殊的、大型OO程序庫,幫你架構程序本體)之外,對象代表的是程序中的觀念,而不是程序本身。
26. 如果你得用某種丑陋的方式來達成某個動作,請將丑陋的部分局限在某個class里頭。
27. 如果你得用某種不可移植方式來達成某個動作,請將它抽象化并局限于某個class里頭。這樣一個”額外間接層”能夠防止不可移植的部分擴散到整個程序。這種作法的具體呈現便是Bridge設計模式(design pattern)。
28. 對象不應僅僅只用來持有數據。
對象也應該具有定義明確界限清楚的行為。有時候使用”數據對象”是適當的,但只有在通用形容器不適用時,才適合刻意以數據對象來包裝、傳輸一群數據項。
29. 欲從既有的classes身上產生新的classes時,請以組合(composition)為優先考量。
你應該只在必要時才使用繼承。如果在組合適用之處你卻選擇了繼承,你的設計就滲雜了非必要的復雜性。
30. 運用繼承和函數覆寫機制來展現行為上的差異,運用fields(數據成員)來展現狀態上的差異。
這句話的極端例子,就是繼承出不同的classes表現各種不同的顏色,而不使用”color”field.
31. 當心變異性(variance)。
語意相異的兩個對象擁有相同的動作(或說責任)是可能的。OO世界中存在著一種天生的引誘,讓人想要從某個class繼承出另一個subclass,為的是獲得繼承帶來的福利。這便是所謂”變異性”。但是,沒有任何正當理由足以讓我們強迫制造出某個其實并不存在的superclass/subclass關系。比較好的解決方式是寫出一個共用的base class,它為兩個derived classes制作出共用接口–這種方式會耗用更多空間,但你可以如你所盼望地從繼承機制獲得好處,而且或許能夠在設計上獲得重大發現。
32. 注意繼承上的限制。
最清晰易懂的設計是將功能加到繼承得來的class里頭;繼承過程中拿掉舊功能(而非增加新功能)則是一種可疑的設計。不過,規則可以打破。如果你所處理的是舊有的class程序庫,那么在某個class的subclass限制功能,可能會比重新制定整個結構(俾使新class得以良好地相稱于舊 class)有效率得多。
33. 使用設計模式(design patterns)來減少”赤裸裸無加掩飾的機能(naked functionality)”。
舉個例子,如果你的class只應該產出惟一一個對象,那么請不要以加思索毫無設計的手法來完成它,然后撰寫”只該產生一份對象”這樣的注解就拍拍屁股走人。請將它包裝成singleton(譯注:一個有名的設計模式,可譯為”單件”)。如果主程序中有多而混亂的”用以產生對象”的程序代碼,請找出類似 factory method這樣的生成模式(creational patterns),使價錢可用以封裝生成動作減少”赤裸裸無加掩飾的機能”(naked functionality)不僅可以讓你的程序更易理解和維護,也可以阻止出于好意卻帶來意外的維護者。
34. 當心”因分析而導致的癱瘓(analysis paralysis)”。
請記住,你往往必須在獲得所有信息之前讓項目繼續前進。而且理解未知部分的最好也最快的方式,通常就是實際前進一步而不只是紙上談兵。除非找到解決辦法,否則無法知道解決辦法。Java擁有內置的防火墻,請讓它們發揮作用。你在單一class或一組classes中所犯的錯誤,并不會傷害整個系統的完整性。
35. 當你認為你已經獲得一份優秀的分析、設計或實現時,請試著加以演練。
將團隊以外的某些人帶進來-他不必非得是個顧問不可,他可以是公司其他團隊的成員。請那個人以新鮮的姿態審視你們的成果,這樣可以在尚可輕易修改的階段找出問題,其收獲會比因演練而付出的時間和金錢代價來得高。實現 (Implementation)
36. 一般來說,請遵守Sun的程序編寫習慣。
價錢可以在以下網址找到相關文檔:java.sun.com/docs/codeconv/idex.html。本書盡可能遵守這些習慣。眾多Java程序員看到的程序代碼,都有是由這些習慣構成的。如果你固執地停留在過去的編寫風格中,你的(程序代碼)讀者會比較辛苦。不論你決定采用什么編寫習慣,請在整個程序中保持一致。你可以在home.wtal.de/software-solutions/jindent上找到一個用來重排Java程序的免費工具。
37. 無論使用何種編寫風格,如果你的團隊(或整個公司,那就更好了)能夠加以標準化,那么的確會帶來顯著效果。這代表每個人都可以在其他人不遵守編寫風格修改其作品,這是個公平的游戲。標準化的價值在于,分析程序代碼時所花的腦力較小,因而可以專心于程序代碼的實質意義。
38. 遵守標準的大小寫規范。
將 class名稱的第一個字母應為大寫。數據成員、函數、對象(references)的第一個字母應為小寫。所有識別名稱的每個字都應該連在一塊兒,所有非首字的第一個字母都應該大寫。例如: ThisIsAClassName thisIsAMethodOrFieldName 如果你在static final 基本型別的定義處指定了常量初始式(constant initializers),那么該識別名稱應該全為大寫,代表一個編譯期常量。 Packages是個特例,其名稱皆為小寫,即使非首字的字母亦是如此。域名(org, net, edu 等等)皆應為小寫。(這是Java 1.1遷移至Java 2時的一項改變) 。
39、不要自己發明”裝飾用的”Private數據成員名稱。
通常這種的形式是在最前端加上底線和其他字符,匈牙利命名法(Hungarian notation)是其中最差的示范。在這種命名法中,你得加入額外字符來表示數據的型別、用途、位置等等。仿佛你用的是匯編語言(assembly language)而編譯器沒有提供任何協肋似的。這樣的命名方式容易讓人混淆又難以閱讀,也不易推行和維護。就讓classes和packages來進行”名稱上的范
圍制定(name scoping)”吧。
40、當你擬定通用性的class時,請遵守正規形式(canonical form)。
包括equals( )、hashCode( )、clone( ) ( 實現出Cloneable),并實現出Comparable和Serialiable等等。
首先,業務邏輯中的日志是個性化的,無法統一的,只有在業務邏輯中打印才可以。
其次,如果有對某個方法調用前后的,比較通用的日志,可以使用攔截器實現。
注釋中可以使用 Latex或MathML。
Latex有 LatexLet 常量
MathML有 MathJax
一、不要使用魔法數字,盡量定義枚舉、常量、宏:
我常常見到表示各種狀態的數字,0,1,2....,我真的不知道這表示什么含義,如果
你在不在文檔中說明的話,這個東東過幾天連你自己都不知道個一二三了。
二、命名要具有描述力,盡量使用全名而不是自創的縮寫,除非地球人都這么用這個縮寫:
我常常看到一些自創的縮寫,這個縮寫或許只有你自己知道,類名,方法名,參數名
尤其要有好的描述里,局部變量尚可容忍。我寧可容忍超過40個字符的命令,也不愿意
看到只有一兩個字母的命名,當然迭代用的i,j除外。當然命名不要太長,太長說明你的類和
方法要做的事情太多,請你拆分出更多細粒度功能單一的類和方法。
三、同一類東東命名方式盡可能統一,比如類名使用大寫字母開頭的單詞,變量使用
下劃線分割開來的小寫字母單詞,常量使用下滑線分割的開來的大寫字母單詞。不要
交替使用。
四、函數、類功能盡可能單一,不要試圖寫一個萬能/超級函數或者類。
一個類和方法要有單一的職責,這樣的類和方法只做一件事,并且容易把他做好。
1、不要試圖寫一個強大無比的方法。
我常常看到一些試圖寫的多么“精妙”無比多么“強大”的函數,事實上不是什么精妙,而是
代碼的臭味道。精妙強大無比萬能的方法往往你耗費大量精力去設計算法,試圖覆蓋現在的各
種可能,而無法面對將來新的需求,隨著新的需求,你的這個精妙的方法需要的修改并且改起來
極其痛苦。在一次次的痛苦與精妙的演化中,你的方法越來越復雜,并且每一次修改你都會面
臨影響以前功能的風險。這個方法使用者需要小心的處理你的精妙之處,如果沒有精妙傳遞好參
數,那么這個方法再也不精妙了,而是直接廢掉了。
KISS(keep it simple and stupid)原理就是這個道理,你要使你的代碼盡可能簡單,讓人
看到有一目了然的清爽,而不是因為設計了一個精妙無比的萬能方法而沾沾自喜。這里的簡單不是
簡潔的代名字。有時候簡潔是那種傳說的“精妙”的代碼。
2、不要寫做多件事情的方法和類,你做一件事情,你就寫一個對應的方法,不要試圖通過參數來判定各種情況,然后做事情,并且做的事情和你方法描述的不一致。當你發現你的方法名字想不出來好的名字了,或者要加or和and了,那么請你拆分出更多單一的方法。
不要舉一些linux完成多種功能系統調用,這是被迫的,因為系統調用的數量是有限制的,它只有有限的空間來描述系統調用號和系統調用的映射表,不要在應用程序開發中效仿而誤以為優雅強大。我最惡心根據參數,然后一大堆的if..else 和switch..case判斷。
五、不要修改已有的類和方法而是擴展它。
這是程序設計的一個重要原則,開閉原則,在面向對象的語言中尤為重要。在面向過程中主要表現在,不要在一個函數要應對和這個函數相似的一個需求了,就在這個加個if,來修改這個方法,試圖重用和避免重復。而是要把公用的部分抽出來成一個小的功能函數,然后增加一個應對新的類似這個需求的處理方法。在面向對象中,例如使用策略模式、訪問者模式、Extend Object模式。
六、不要重復你自己(DRY):
程序最怕的是copy,paste,到處是重復的代碼。copy,paste經常被誤以為快速完成需要用的功能的高效方式而被到處使用。你每重復一次,你就得負責保持他們的一致性,你就得在一處增加新的功能時,你就的把這個的功能加到其他地方。還在我剛會寫代碼的時候去了一個小公司,他們的代碼到處是copy,paste的痕跡,當要在現有的功能增加審計功能是,他們開始下命令了,每個人加幾行代碼來做審計,真不知道那么多人寫的審計版本,分散到那么多處,這個審計功能是否可信有用。
避免DRY的方法就是抽象,分離變化。不管是面向對象還是面向過程,分離變化并抽象之是最主要的設計原則。設計模式中的模板方法,我們常用的回調都是我們常用的方法。
我發現越是提供更多回調處理的語言和框架,就越具有靈活性和易用性。ruby語言之所以有如此的威力,主要是因為它提供了更多的回調處理。它可以在動態的給一個類增加方法,這樣可以在超類中定義增加方法的方法,然后再子類調用,子類就具有無比的能力。它的block提供了強大的回調機制,我只要不知道如何處理了我就yield出來,method missing機制更是神秘無比,你可以寫出像find_by_name_and_age,2.days.ago這樣像自然語言一樣易讀的代碼。
七、不要跨越邊界,在適合的地方寫代碼。
在分層的架構中,不要跨越層的邊界。例如web開發的三層架構:
數據訪問層(DAO)、業務層(Service)、表現層。
不要在業務層裸寫SQL來做事情,不要在業務層摻和進來表現層的東東,不要在表現層/控制器中寫業務的東東。既然已經分層了,那么就要好好的遵守它,如果到處跨越邊界的話,那么和不分層沒有什么區別,使得每一層都不倫不類。例如你應該在業務層進行事務管理,而你的控制器到處是業務代碼,那將無法控制。如果你的業務層到處是SQL,我不知道你的DAO存在的意義了。
八、分層的web架構:
DAO層最好按照模型來劃分dao類,如果業務很簡單,也可以將相關的模型合并為一個DAO。
Service層,不要按照DAO和Service一一對應的方式劃分,而是要按照業務的類別和實際情況來劃分。事實上Service層通常是用來處理涉及到多個模型的業務,而涉及到一個模型的業務,常常被放在模型中,這是一種自然而更面向對象的設計方法。只有數據的模型被稱為貧血型模型,這種模型被認為是對面向對象的一種背離,而在模型中放置專有的業務方法,不僅有利于公用,而且模型更具有描述力。
九、關于MVC:
MVC是一種松耦合的設計方案,最容易誤用的就是控制器(c)。控制器只負責調用業務方法,準備好數據供View去展現。而不要把業務和如何展示的東東放在里面。我常常看到有人在控制器中拼html片段和寫一些業務相關的代碼。
十、順便說一下異常的使用。
如果你是使用語言支持異常機制,那么盡可能的使用異常機制和定義好與自己業務相關的異常,而不是通過返回值表示正確和錯誤。如果你使用的語言支持異常機制,請不要寫類linux下c似的代碼形式,每寫一個函數,我就寫一個判斷返回值調用是否成功,嚴重分離了我對核心業務的關注。異常提供了優雅的處理錯誤的方法。
文章名稱:java優雅代碼發現,java高質量代碼示例
文章鏈接:http://m.kartarina.com/article14/hsdege.html
成都網站建設公司_創新互聯,為您提供品牌網站制作、微信小程序、用戶體驗、小程序開發、手機網站建設、服務器托管
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯