java優雅代碼發現,java高質量代碼示例

java看別人代碼發現這段 為何要這樣生成隨機long值

先通過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]

GitHub上面有哪些經典的java框架源碼

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

用來幫助創建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

資源

社區

如何寫出更好的Java代碼

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等等。

如何優雅地在java代碼中做日志記錄

首先,業務邏輯中的日志是個性化的,無法統一的,只有在業務邏輯中打印才可以。

其次,如果有對某個方法調用前后的,比較通用的日志,可以使用攔截器實現。

如何在C++/Java等代碼和注釋中優雅地表達數學公式

注釋中可以使用 Latex或MathML。

Latex有 LatexLet 常量

MathML有 MathJax

如何寫出優雅Java編程

一、不要使用魔法數字,盡量定義枚舉、常量、宏:

我常常見到表示各種狀態的數字,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。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站建設網站維護公司
主站蜘蛛池模板: 精品国产性色无码AV网站| 亚洲日韩精品无码一区二区三区| 久久精品中文字幕无码| 人妻少妇偷人精品无码| 精品久久久久久无码中文野结衣| 国产精品爽爽va在线观看无码| 最新国产精品无码| 一本天堂ⅴ无码亚洲道久久| 免费一区二区无码视频在线播放 | 亚洲av中文无码乱人伦在线播放| 无码一区二区三区| 韩国精品一区二区三区无码视频| 亚洲av无码不卡| 免费无码国产在线观国内自拍中文字幕| 最新国产精品无码| 精品久久久久久无码中文字幕| 中文字幕无码亚洲欧洲日韩| 中文字幕无码免费久久9一区9| 亚洲av无码专区青青草原| 亚洲AV无码一区二区二三区软件 | 精品人妻大屁股白浆无码| 国产精品无码素人福利| 亚洲aⅴ无码专区在线观看| 无码精品人妻一区二区三区免费看| 国产成人无码网站| 无码精品A∨在线观看无广告| AAA级久久久精品无码片| 日韩欧精品无码视频无删节 | 无码国产精品一区二区免费式直播| 色综合久久久无码中文字幕波多| AV无码久久久久不卡蜜桃 | 精品久久久久久无码中文野结衣| 久久久无码一区二区三区| 国内精品人妻无码久久久影院| 人妻无码一区二区三区四区| 国产精品午夜无码体验区 | 无码Aⅴ在线观看| 少妇人妻偷人精品无码AV| 亚洲熟妇无码AV不卡在线播放 | 亚洲Av永久无码精品一区二区| 日韩国产成人无码av毛片|