From bc486cdac4ede533314c1a844ba53e0c876f6dc2 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 11 Apr 2020 13:08:46 +0800 Subject: [PATCH] fix code --- CHANGELOG.md | 2 + .../aop/aspects/TimeIntervalAspect.java | 2 +- .../aop/interceptor/JdkInterceptor.java | 4 +- .../hutool/bloomfilter/BitMapBloomFilter.java | 2 +- .../cn/hutool/bloomfilter/bitMap/IntMap.java | 2 +- .../cn/hutool/bloomfilter/bitMap/LongMap.java | 2 +- .../cn/hutool/cache/GlobalPruneTimer.java | 2 +- .../java/cn/hutool/cache/impl/NoCache.java | 16 +- .../java/cn/hutool/captcha/ShearCaptcha.java | 20 +- .../captcha/generator/MathGenerator.java | 2 +- .../java/cn/hutool/core/bean/BeanPath.java | 28 +- .../java/cn/hutool/core/bean/BeanUtil.java | 2 +- .../java/cn/hutool/core/bean/DynaBean.java | 12 +- .../copier/provider/MapValueProvider.java | 2 +- .../hutool/core/builder/CompareToBuilder.java | 14 +- .../cn/hutool/core/builder/EqualsBuilder.java | 19 +- .../core/collection/BoundedPriorityQueue.java | 3 +- .../cn/hutool/core/collection/CopiedIter.java | 2 +- .../core/comparator/ComparatorChain.java | 11 +- .../core/comparator/IndexedComparator.java | 6 +- .../core/convert/ConverterRegistry.java | 4 +- .../core/convert/impl/BooleanConverter.java | 7 +- .../core/convert/impl/CharacterConverter.java | 8 +- .../core/convert/impl/DateConverter.java | 2 +- .../core/convert/impl/EnumConverter.java | 2 +- .../convert/impl/GenericEnumConverter.java | 2 +- .../core/convert/impl/NumberConverter.java | 28 +- .../core/convert/impl/PrimitiveConverter.java | 2 +- .../core/convert/impl/ReferenceConverter.java | 12 +- .../impl/TemporalAccessorConverter.java | 2 +- .../java/cn/hutool/core/date/DateBetween.java | 4 +- .../java/cn/hutool/core/date/DateField.java | 2 +- .../java/cn/hutool/core/date/DateUnit.java | 2 +- .../main/java/cn/hutool/core/date/Month.java | 2 +- .../java/cn/hutool/core/date/Quarter.java | 2 +- .../java/cn/hutool/core/date/SystemClock.java | 2 +- .../cn/hutool/core/date/TimeInterval.java | 2 +- .../main/java/cn/hutool/core/date/Week.java | 2 +- .../core/date/format/FastDatePrinter.java | 6 +- .../src/main/java/cn/hutool/core/img/Img.java | 2 +- .../java/cn/hutool/core/img/ScaleType.java | 2 +- .../main/java/cn/hutool/core/io/FileUtil.java | 2 +- .../cn/hutool/core/io/file/FileAppender.java | 12 +- .../hutool/core/io/file/LineReadWatcher.java | 16 +- .../cn/hutool/core/io/file/LineSeparator.java | 2 +- .../java/cn/hutool/core/io/file/Tailer.java | 30 +- .../core/io/resource/InputStreamResource.java | 12 +- .../core/io/resource/MultiResource.java | 8 +- .../core/io/resource/StringResource.java | 14 +- .../hutool/core/io/resource/UrlResource.java | 16 +- .../cn/hutool/core/io/watch/WatchKind.java | 2 +- .../cn/hutool/core/io/watch/WatchServer.java | 2 +- .../cn/hutool/core/lang/ClassScanner.java | 1 - .../main/java/cn/hutool/core/lang/Pair.java | 8 +- .../java/cn/hutool/core/lang/PatternPool.java | 4 +- .../main/java/cn/hutool/core/lang/Range.java | 12 +- .../java/cn/hutool/core/lang/SimpleCache.java | 61 ++-- .../java/cn/hutool/core/lang/Singleton.java | 52 ++-- .../java/cn/hutool/core/lang/Snowflake.java | 6 +- .../main/java/cn/hutool/core/lang/UUID.java | 26 +- .../cn/hutool/core/lang/WeightRandom.java | 14 +- .../java/cn/hutool/core/lang/tree/Tree.java | 2 +- .../java/cn/hutool/core/map/MapBuilder.java | 2 +- .../java/cn/hutool/core/map/MapProxy.java | 16 +- .../java/cn/hutool/core/map/TableMap.java | 8 +- .../java/cn/hutool/core/map/TolerantMap.java | 290 +++++++++--------- .../main/java/cn/hutool/core/math/Money.java | 2 +- .../swing/clipboard/ClipboardMonitor.java | 9 +- .../core/swing/clipboard/ImageSelection.java | 5 +- .../java/cn/hutool/core/text/Simhash.java | 24 +- .../java/cn/hutool/core/text/StrSpliter.java | 28 +- .../java/cn/hutool/core/text/UnicodeUtil.java | 2 +- .../cn/hutool/core/text/csv/CsvParser.java | 20 +- .../text/escape/NumericEntityUnescaper.java | 2 +- .../core/text/replacer/ReplacerChain.java | 8 +- .../hutool/core/thread/ConcurrencyTester.java | 4 +- .../cn/hutool/core/thread/RejectPolicy.java | 2 +- .../hutool/core/thread/SemaphoreRunnable.java | 4 +- .../cn/hutool/core/thread/SyncFinisher.java | 14 +- .../cn/hutool/core/thread/lock/LockUtil.java | 2 +- .../cn/hutool/core/thread/lock/NoLock.java | 2 +- .../main/java/cn/hutool/core/util/IdUtil.java | 50 +-- .../java/cn/hutool/core/util/IdcardUtil.java | 156 +++++----- .../cn/hutool/core/util/ModifierUtil.java | 2 +- .../java/cn/hutool/core/util/ObjectUtil.java | 4 +- .../java/cn/hutool/core/util/RuntimeUtil.java | 97 ++++-- .../java/cn/hutool/core/util/TypeUtil.java | 6 +- .../core/convert/ConvertToCollectionTest.java | 13 +- .../cn/hutool/core/date/DateTimeTest.java | 6 +- .../java/cn/hutool/core/img/ImgUtilTest.java | 13 +- .../java/cn/hutool/core/lang/RangeTest.java | 28 +- .../cn/hutool/core/lang/SingletonTest.java | 30 ++ .../cn/hutool/core/math/CombinationTest.java | 6 +- .../core/swing/ClipboardMonitorTest.java | 35 +-- .../hutool/core/text/csv/CsvParserTest.java | 13 +- .../cn/hutool/core/text/csv/CsvUtilTest.java | 4 +- .../core/thread/ConcurrencyTesterTest.java | 12 +- .../cn/hutool/core/thread/ThreadUtilTest.java | 8 +- .../cn/hutool/core/util/EnumUtilTest.java | 14 +- .../java/cn/hutool/core/util/IdUtilTest.java | 44 ++- .../main/java/cn/hutool/cron/CronTimer.java | 12 +- .../main/java/cn/hutool/cron/Scheduler.java | 2 +- .../java/cn/hutool/cron/TaskExecutor.java | 4 +- .../java/cn/hutool/cron/TaskLauncher.java | 4 +- .../main/java/cn/hutool/cron/TaskTable.java | 18 +- .../cn/hutool/cron/pattern/CronPattern.java | 28 +- .../pattern/matcher/YearValueMatcher.java | 2 +- .../java/cn/hutool/cron/task/InvokeTask.java | 8 +- .../cn/hutool/cron/task/RunnableTask.java | 2 +- .../cron/demo/AddAndRemoveMainTest.java | 15 +- .../java/cn/hutool/cron/demo/TestJob.java | 2 +- .../crypto/asymmetric/SignAlgorithm.java | 2 +- .../java/cn/hutool/crypto/digest/BCrypt.java | 13 +- .../hutool/crypto/digest/DigestAlgorithm.java | 2 +- .../java/cn/hutool/crypto/digest/HMac.java | 17 +- .../hutool/crypto/digest/HmacAlgorithm.java | 2 +- .../crypto/symmetric/SymmetricAlgorithm.java | 2 +- .../crypto/symmetric/SymmetricCrypto.java | 2 +- .../cn/hutool/crypto/test/BCUtilTest.java | 5 - .../cn/hutool/db/ThreadLocalConnection.java | 5 +- .../cn/hutool/db/dialect/DialectFactory.java | 47 ++- .../cn/hutool/db/ds/DataSourceWrapper.java | 11 +- .../cn/hutool/db/ds/pooled/DbSetting.java | 2 +- .../hutool/db/ds/pooled/PooledConnection.java | 6 +- .../hutool/db/ds/pooled/PooledDataSource.java | 19 +- .../cn/hutool/db/handler/EntityHandler.java | 6 +- .../hutool/db/handler/EntityListHandler.java | 6 +- .../hutool/db/handler/EntitySetHandler.java | 6 +- .../hutool/db/handler/PageResultHandler.java | 10 +- .../main/java/cn/hutool/db/meta/JdbcType.java | 9 +- .../main/java/cn/hutool/db/meta/Table.java | 4 +- .../java/cn/hutool/db/meta/TableType.java | 2 +- .../hutool/db/nosql/mongo/MongoFactory.java | 40 ++- .../main/java/cn/hutool/db/sql/Condition.java | 123 ++++---- .../main/java/cn/hutool/db/sql/NamedSql.java | 8 +- .../java/cn/hutool/db/sql/SqlFormatter.java | 7 +- .../main/java/cn/hutool/db/sql/SqlUtil.java | 16 +- .../main/java/cn/hutool/db/sql/Wrapper.java | 10 +- .../db/transaction/TransactionLevel.java | 2 +- .../src/test/java/cn/hutool/db/CRUDTest.java | 2 +- .../test/java/cn/hutool/db/ConcurentTest.java | 30 +- .../test/java/cn/hutool/db/SessionTest.java | 11 +- .../java/cn/hutool/dfa/SensitiveUtil.java | 2 +- .../src/main/java/cn/hutool/dfa/WordTree.java | 12 +- .../hutool/extra/mail/InternalMailUtil.java | 24 +- .../main/java/cn/hutool/extra/mail/Mail.java | 27 +- .../cn/hutool/extra/mail/MailAccount.java | 2 +- .../java/cn/hutool/extra/mail/MailUtil.java | 16 +- .../extra/mail/UserPassAuthenticator.java | 4 +- .../qrcode/BufferedImageLuminanceSource.java | 1 + .../cn/hutool/extra/ssh/JschSessionPool.java | 2 +- .../template/engine/enjoy/EnjoyTemplate.java | 6 +- .../template/engine/rythm/RythmTemplate.java | 2 +- .../engine/thymeleaf/ThymeleafTemplate.java | 25 +- .../engine/velocity/VelocityTemplate.java | 17 +- .../engine/velocity/VelocityUtil.java | 2 +- .../tokenizer/engine/hanlp/HanLPEngine.java | 2 +- .../tokenizer/engine/hanlp/HanLPWord.java | 2 +- .../engine/ikanalyzer/IKAnalyzerEngine.java | 2 +- .../engine/ikanalyzer/IKAnalyzerResult.java | 11 +- .../engine/ikanalyzer/IKAnalyzerWord.java | 2 +- .../tokenizer/engine/jcseg/JcsegEngine.java | 15 +- .../tokenizer/engine/jcseg/JcsegResult.java | 2 +- .../tokenizer/engine/jieba/JiebaEngine.java | 4 +- .../tokenizer/engine/mmseg/MmsegEngine.java | 11 +- .../tokenizer/engine/mmseg/MmsegResult.java | 9 +- .../tokenizer/engine/mynlp/MynlpEngine.java | 2 +- .../tokenizer/engine/mynlp/MynlpResult.java | 11 +- .../tokenizer/engine/word/WordEngine.java | 2 +- .../tokenizer/engine/word/WordResult.java | 8 +- .../main/java/cn/hutool/http/ContentType.java | 2 +- .../src/main/java/cn/hutool/http/Header.java | 2 +- .../java/cn/hutool/http/HttpConnection.java | 4 +- .../java/cn/hutool/http/HttpInputStream.java | 9 +- .../java/cn/hutool/http/HttpResponse.java | 2 +- .../hutool/http/server/action/RootAction.java | 2 +- .../http/ssl/CustomProtocolsSSLFactory.java | 9 +- .../hutool/http/useragent/UserAgentInfo.java | 8 +- .../cn/hutool/http/webservice/SoapClient.java | 35 +-- .../hutool/http/webservice/SoapProtocol.java | 2 +- .../cn/hutool/http/test/DownloadTest.java | 2 +- .../main/java/cn/hutool/json/JSONNull.java | 8 +- .../main/java/cn/hutool/json/JSONTokener.java | 2 +- .../java/cn/hutool/json/JSONArrayTest.java | 18 +- .../cn/hutool/json/test/bean/ResultDto.java | 2 +- .../main/java/cn/hutool/log/LogFactory.java | 2 +- .../log/dialect/console/ConsoleLog.java | 2 +- .../cn/hutool/log/dialect/slf4j/Slf4jLog.java | 1 - .../hutool/log/dialect/tinylog/TinyLog.java | 4 +- .../java/cn/hutool/poi/excel/StyleSet.java | 7 +- .../poi/excel/sax/Excel03SaxReader.java | 6 +- .../poi/excel/sax/Excel07SaxReader.java | 2 +- .../main/java/cn/hutool/poi/word/PicType.java | 2 +- .../java/cn/hutool/poi/word/Word07Writer.java | 2 +- .../java/cn/hutool/script/ScriptUtil.java | 12 +- .../java/cn/hutool/setting/GroupedSet.java | 17 +- .../java/cn/hutool/setting/SettingLoader.java | 9 +- .../java/cn/hutool/setting/SettingUtil.java | 11 +- .../cn/hutool/setting/dialect/PropsUtil.java | 2 +- .../cn/hutool/setting/profile/Profile.java | 10 +- .../hutool/setting/test/SettingUtilTest.java | 4 +- .../java/cn/hutool/socket/SocketConfig.java | 7 +- .../java/cn/hutool/socket/nio/NioServer.java | 9 +- .../java/cn/hutool/socket/nio/Operation.java | 2 +- .../main/java/cn/hutool/system/HostInfo.java | 13 +- .../main/java/cn/hutool/system/JavaInfo.java | 128 +++----- .../java/cn/hutool/system/RuntimeInfo.java | 39 ++- 207 files changed, 1329 insertions(+), 1355 deletions(-) create mode 100644 hutool-core/src/test/java/cn/hutool/core/lang/SingletonTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b35532a2..743a0af62 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,8 @@ * 【all 】 cn.hutool.extra.servlet.multipart包迁移到cn.hutool.core.net下 * 【core 】 XmlUtil.mapToXml方法支持集合解析(issue#820@Github) * 【json 】 解析Object中对是否为bean单独判断,而不是直接解析 +* 【core 】 SimHash锁改为StampedLock +* 【core 】 Singleton改为SimpleCache实现 ### Bug修复 * 【extra 】 修复SpringUtil使用devtools重启报错问题 diff --git a/hutool-aop/src/main/java/cn/hutool/aop/aspects/TimeIntervalAspect.java b/hutool-aop/src/main/java/cn/hutool/aop/aspects/TimeIntervalAspect.java index 719ac3fb1..fd8da9b48 100644 --- a/hutool-aop/src/main/java/cn/hutool/aop/aspects/TimeIntervalAspect.java +++ b/hutool-aop/src/main/java/cn/hutool/aop/aspects/TimeIntervalAspect.java @@ -13,7 +13,7 @@ import java.lang.reflect.Method; public class TimeIntervalAspect extends SimpleAspect { private static final long serialVersionUID = 1L; - private TimeInterval interval = new TimeInterval(); + private final TimeInterval interval = new TimeInterval(); @Override public boolean before(Object target, Method method, Object[] args) { diff --git a/hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java b/hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java index 82a3a1eab..baa6d4b05 100644 --- a/hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java +++ b/hutool-aop/src/main/java/cn/hutool/aop/interceptor/JdkInterceptor.java @@ -18,8 +18,8 @@ import java.lang.reflect.Method; public class JdkInterceptor implements InvocationHandler, Serializable { private static final long serialVersionUID = 1L; - private Object target; - private Aspect aspect; + private final Object target; + private final Aspect aspect; /** * 构造 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitMapBloomFilter.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitMapBloomFilter.java index 2a1096abb..589e2bfbb 100644 --- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitMapBloomFilter.java +++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/BitMapBloomFilter.java @@ -55,7 +55,7 @@ public class BitMapBloomFilter implements BloomFilter{ */ @Override public boolean add(String str) { - boolean flag = true; + boolean flag = false; for (BloomFilter filter : filters) { flag |= filter.add(str); } diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java index e5d310ca4..e6f83d540 100644 --- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java +++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/IntMap.java @@ -11,7 +11,7 @@ import java.io.Serializable; public class IntMap implements BitMap, Serializable { private static final long serialVersionUID = 1L; - private int[] ints; + private final int[] ints; /** * 构造 diff --git a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java index 75d021db6..7ee584663 100644 --- a/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java +++ b/hutool-bloomFilter/src/main/java/cn/hutool/bloomfilter/bitMap/LongMap.java @@ -11,7 +11,7 @@ import java.io.Serializable; public class LongMap implements BitMap, Serializable { private static final long serialVersionUID = 1L; - private long[] longs; + private final long[] longs; /** * 构造 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/GlobalPruneTimer.java b/hutool-cache/src/main/java/cn/hutool/cache/GlobalPruneTimer.java index a7f95fcda..cff84d52e 100644 --- a/hutool-cache/src/main/java/cn/hutool/cache/GlobalPruneTimer.java +++ b/hutool-cache/src/main/java/cn/hutool/cache/GlobalPruneTimer.java @@ -24,7 +24,7 @@ public enum GlobalPruneTimer { /** * 缓存任务计数 */ - private AtomicInteger cacheTaskNumber = new AtomicInteger(1); + private final AtomicInteger cacheTaskNumber = new AtomicInteger(1); /** * 定时器 diff --git a/hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java b/hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java index 0964109cd..55d6ec896 100644 --- a/hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java +++ b/hutool-cache/src/main/java/cn/hutool/cache/impl/NoCache.java @@ -1,10 +1,10 @@ package cn.hutool.cache.impl; -import java.util.Iterator; - import cn.hutool.cache.Cache; import cn.hutool.core.lang.func.Func0; +import java.util.Iterator; + /** * 无缓存实现,用于快速关闭缓存 * @@ -61,7 +61,17 @@ public class NoCache implements Cache { @Override public Iterator iterator() { - return null; + return new Iterator() { + @Override + public boolean hasNext() { + return false; + } + + @Override + public V next() { + return null; + } + }; } @Override diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java b/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java index fa22ff72c..f99f577fc 100644 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/ShearCaptcha.java @@ -1,16 +1,16 @@ package cn.hutool.captcha; +import cn.hutool.core.img.GraphicsUtil; +import cn.hutool.core.img.ImgUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; + import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; -import cn.hutool.core.img.GraphicsUtil; -import cn.hutool.core.img.ImgUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.RandomUtil; - /** * 扭曲干扰验证码 * @@ -110,18 +110,15 @@ public class ShearCaptcha extends AbstractCaptcha { int period = RandomUtil.randomInt(this.width); - boolean borderGap = true; int frames = 1; int phase = RandomUtil.randomInt(2); for (int i = 0; i < h1; i++) { double d = (double) (period >> 1) * Math.sin((double) i / (double) period + (6.2831853071795862D * (double) phase) / (double) frames); g.copyArea(0, i, w1, 1, (int) d, 0); - if (borderGap) { - g.setColor(color); - g.drawLine((int) d, i, 0, i); - g.drawLine((int) d + w1, i, w1, i); - } + g.setColor(color); + g.drawLine((int) d, i, 0, i); + g.drawLine((int) d + w1, i, w1, i); } } @@ -162,6 +159,7 @@ public class ShearCaptcha extends AbstractCaptcha { * @param thickness 粗细 * @param c 颜色 */ + @SuppressWarnings("SameParameterValue") private void drawInterfere(Graphics g, int x1, int y1, int x2, int y2, int thickness, Color c) { // The thick line is in fact a filled polygon diff --git a/hutool-captcha/src/main/java/cn/hutool/captcha/generator/MathGenerator.java b/hutool-captcha/src/main/java/cn/hutool/captcha/generator/MathGenerator.java index 2beb52194..748706d75 100644 --- a/hutool-captcha/src/main/java/cn/hutool/captcha/generator/MathGenerator.java +++ b/hutool-captcha/src/main/java/cn/hutool/captcha/generator/MathGenerator.java @@ -16,7 +16,7 @@ public class MathGenerator implements CodeGenerator { private static final String operators = "+-*"; /** 参与计算数字最大长度 */ - private int numberLength; + private final int numberLength; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java index ba7bead3e..47928ddcf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanPath.java @@ -1,13 +1,5 @@ package cn.hutool.core.bean; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.map.MapUtil; @@ -16,6 +8,14 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.StrUtil; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** * Bean路径表达式,用于获取多层嵌套Bean中的字段值或Bean对象
* 根据给定的表达式,查找Bean中对应的属性值对象。 表达式分为两种: @@ -242,10 +242,6 @@ public class BeanPath implements Serializable{ } isNumStart = false; // 中括号结束加入下标 - if (builder.length() > 0) { - localPatternParts.add(unWrapIfPossible(builder)); - } - builder.reset(); } else { if (isNumStart) { // 非结束中括号情况下发现起始中括号报错(中括号未关闭) @@ -255,11 +251,11 @@ public class BeanPath implements Serializable{ isNumStart = true; } // 每一个边界符之前的表达式是一个完整的KEY,开始处理KEY - if (builder.length() > 0) { - localPatternParts.add(unWrapIfPossible(builder)); - } - builder.reset(); } + if (builder.length() > 0) { + localPatternParts.add(unWrapIfPossible(builder)); + } + builder.reset(); } else { // 非边界符号,追加字符 builder.append(c); diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java index e0c095705..c2f3257a7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/BeanUtil.java @@ -694,7 +694,7 @@ public class BeanUtil { */ public static T trimStrFields(T bean, String... ignoreFields) { if (bean == null) { - return bean; + return null; } final Field[] fields = ReflectUtil.getFields(bean.getClass()); diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/DynaBean.java b/hutool-core/src/main/java/cn/hutool/core/bean/DynaBean.java index 915e60e05..8df3da986 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/DynaBean.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/DynaBean.java @@ -1,14 +1,14 @@ package cn.hutool.core.bean; -import java.io.Serializable; -import java.lang.reflect.Method; -import java.util.Map; - import cn.hutool.core.clone.CloneSupport; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ReflectUtil; +import java.io.Serializable; +import java.lang.reflect.Method; +import java.util.Map; + /** * 动态Bean,通过反射对Bean的相关方法做操作
* 支持Map和普通Bean @@ -19,8 +19,8 @@ import cn.hutool.core.util.ReflectUtil; public class DynaBean extends CloneSupport implements Serializable{ private static final long serialVersionUID = 1L; - private Class beanClass; - private Object bean; + private final Class beanClass; + private final Object bean; /** * 创建一个{@link DynaBean} diff --git a/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/MapValueProvider.java b/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/MapValueProvider.java index 2ab2a7e58..896cfab61 100644 --- a/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/MapValueProvider.java +++ b/hutool-core/src/main/java/cn/hutool/core/bean/copier/provider/MapValueProvider.java @@ -16,7 +16,7 @@ import java.util.Map; */ public class MapValueProvider implements ValueProvider { - private Map map; + private final Map map; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/builder/CompareToBuilder.java b/hutool-core/src/main/java/cn/hutool/core/builder/CompareToBuilder.java index 77cf72479..de0c6705b 100644 --- a/hutool-core/src/main/java/cn/hutool/core/builder/CompareToBuilder.java +++ b/hutool-core/src/main/java/cn/hutool/core/builder/CompareToBuilder.java @@ -1,13 +1,13 @@ package cn.hutool.core.builder; +import cn.hutool.core.util.ArrayUtil; + import java.lang.reflect.AccessibleObject; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.Collection; import java.util.Comparator; -import cn.hutool.core.util.ArrayUtil; - /** * 用于构建 {@link java.lang.Comparable#compareTo(Object)} 方法的辅助工具 * @@ -418,7 +418,7 @@ public class CompareToBuilder implements Builder { if (comparison != 0) { return this; } - comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0)); + comparison = (Long.compare(lhs, rhs)); return this; } @@ -434,7 +434,7 @@ public class CompareToBuilder implements Builder { if (comparison != 0) { return this; } - comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0)); + comparison = (Integer.compare(lhs, rhs)); return this; } @@ -450,7 +450,7 @@ public class CompareToBuilder implements Builder { if (comparison != 0) { return this; } - comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0)); + comparison = (Short.compare(lhs, rhs)); return this; } @@ -466,7 +466,7 @@ public class CompareToBuilder implements Builder { if (comparison != 0) { return this; } - comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0)); + comparison = (Character.compare(lhs, rhs)); return this; } @@ -482,7 +482,7 @@ public class CompareToBuilder implements Builder { if (comparison != 0) { return this; } - comparison = ((lhs < rhs) ? -1 : ((lhs > rhs) ? 1 : 0)); + comparison = (Byte.compare(lhs, rhs)); return this; } diff --git a/hutool-core/src/main/java/cn/hutool/core/builder/EqualsBuilder.java b/hutool-core/src/main/java/cn/hutool/core/builder/EqualsBuilder.java index 07ad8c3d7..e03c08ce5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/builder/EqualsBuilder.java +++ b/hutool-core/src/main/java/cn/hutool/core/builder/EqualsBuilder.java @@ -1,5 +1,8 @@ package cn.hutool.core.builder; +import cn.hutool.core.lang.Pair; +import cn.hutool.core.util.ArrayUtil; + import java.lang.reflect.AccessibleObject; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -7,9 +10,6 @@ import java.util.Collection; import java.util.HashSet; import java.util.Set; -import cn.hutool.core.lang.Pair; -import cn.hutool.core.util.ArrayUtil; - /** *

{@link Object#equals(Object)} 方法的构建器

* @@ -51,7 +51,7 @@ public class EqualsBuilder implements Builder { * * @since 3.0 */ - private static final ThreadLocal>> REGISTRY = new ThreadLocal>>(); + private static final ThreadLocal>> REGISTRY = new ThreadLocal<>(); /** *

@@ -79,7 +79,7 @@ public class EqualsBuilder implements Builder { static Pair getRegisterPair(final Object lhs, final Object rhs) { final IDKey left = new IDKey(lhs); final IDKey right = new IDKey(rhs); - return new Pair(left, right); + return new Pair<>(left, right); } /** @@ -98,7 +98,7 @@ public class EqualsBuilder implements Builder { static boolean isRegistered(final Object lhs, final Object rhs) { final Set> registry = getRegistry(); final Pair pair = getRegisterPair(lhs, rhs); - final Pair swappedPair = new Pair(pair.getKey(), pair.getValue()); + final Pair swappedPair = new Pair<>(pair.getKey(), pair.getValue()); return registry != null && (registry.contains(pair) || registry.contains(swappedPair)); @@ -116,7 +116,7 @@ public class EqualsBuilder implements Builder { static void register(final Object lhs, final Object rhs) { synchronized (EqualsBuilder.class) { if (getRegistry() == null) { - REGISTRY.set(new HashSet>()); + REGISTRY.set(new HashSet<>()); } } @@ -845,7 +845,7 @@ public class EqualsBuilder implements Builder { */ @Override public Boolean build() { - return Boolean.valueOf(isEquals()); + return isEquals(); } /** @@ -854,7 +854,8 @@ public class EqualsBuilder implements Builder { * @param isEquals The value to set. * @since 2.1 */ - protected void setEquals(final boolean isEquals) { + @SuppressWarnings("SameParameterValue") + protected void setEquals(boolean isEquals) { this.isEquals = isEquals; } diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/BoundedPriorityQueue.java b/hutool-core/src/main/java/cn/hutool/core/collection/BoundedPriorityQueue.java index c62c93709..d83d1135c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/BoundedPriorityQueue.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/BoundedPriorityQueue.java @@ -2,7 +2,6 @@ package cn.hutool.core.collection; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.PriorityQueue; @@ -80,7 +79,7 @@ public class BoundedPriorityQueue extends PriorityQueue{ */ public ArrayList toList() { final ArrayList list = new ArrayList<>(this); - Collections.sort(list, comparator); + list.sort(comparator); return list; } diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CopiedIter.java b/hutool-core/src/main/java/cn/hutool/core/collection/CopiedIter.java index a9c836423..9b77361fe 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CopiedIter.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CopiedIter.java @@ -24,7 +24,7 @@ import java.util.List; public class CopiedIter implements Iterator, Iterable, Serializable { private static final long serialVersionUID = 1L; - private Iterator listIterator; + private final Iterator listIterator; public static CopiedIter copyOf(Iterator iterator){ return new CopiedIter<>(iterator); diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/ComparatorChain.java b/hutool-core/src/main/java/cn/hutool/core/comparator/ComparatorChain.java index 8dec1aa80..44fee28f0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/comparator/ComparatorChain.java +++ b/hutool-core/src/main/java/cn/hutool/core/comparator/ComparatorChain.java @@ -1,5 +1,7 @@ package cn.hutool.core.comparator; +import cn.hutool.core.lang.Chain; + import java.io.Serializable; import java.util.ArrayList; import java.util.BitSet; @@ -8,8 +10,6 @@ import java.util.Iterator; import java.util.List; import java.util.Objects; -import cn.hutool.core.lang.Chain; - /** * 比较器链。此链包装了多个比较器,最终比较结果按照比较器顺序综合多个比较器结果。
* 按照比较器链的顺序分别比较,如果比较出相等则转向下一个比较器,否则直接返回
@@ -24,7 +24,7 @@ public class ComparatorChain implements Chain, ComparatorChain< /** 比较器链. */ private final List> chain; /** 对应比较器位置是否反序. */ - private BitSet orderingBits; + private final BitSet orderingBits; /** 比较器是否被锁定。锁定的比较器链不能再添加新的比较器。比较器会在开始比较时开始加锁。 */ private boolean lock = false; @@ -249,8 +249,9 @@ public class ComparatorChain implements Chain, ComparatorChain< } if (object.getClass().equals(this.getClass())) { final ComparatorChain otherChain = (ComparatorChain) object; - return (Objects.equals(this.orderingBits, otherChain.orderingBits)) // - && (null == otherChain ? null == otherChain.chain : this.chain.equals(otherChain.chain)); + // + return Objects.equals(this.orderingBits, otherChain.orderingBits) + && this.chain.equals(otherChain.chain); } return false; } diff --git a/hutool-core/src/main/java/cn/hutool/core/comparator/IndexedComparator.java b/hutool-core/src/main/java/cn/hutool/core/comparator/IndexedComparator.java index 0b62eb2d5..adba14c20 100644 --- a/hutool-core/src/main/java/cn/hutool/core/comparator/IndexedComparator.java +++ b/hutool-core/src/main/java/cn/hutool/core/comparator/IndexedComparator.java @@ -1,9 +1,9 @@ package cn.hutool.core.comparator; -import java.util.Comparator; - import cn.hutool.core.util.ArrayUtil; +import java.util.Comparator; + /** * 按照数组的顺序正序排列,数组的元素位置决定了对象的排序先后
* 如果参与排序的元素并不在数组中,则排序在前 @@ -15,7 +15,7 @@ import cn.hutool.core.util.ArrayUtil; */ public class IndexedComparator implements Comparator { - private T[] array; + private final T[] array; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java b/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java index 7869a3741..5b6d2c700 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java @@ -93,7 +93,7 @@ public class ConverterRegistry implements Serializable{ /** 类级的内部类,也就是静态的成员式内部类,该内部类的实例与外部类的实例 没有绑定关系,而且只有被调用到才会装载,从而实现了延迟加载 */ private static class SingletonHolder { /** 静态初始化器,由JVM来保证线程安全 */ - private static ConverterRegistry instance = new ConverterRegistry(); + private static final ConverterRegistry INSTANCE = new ConverterRegistry(); } /** @@ -102,7 +102,7 @@ public class ConverterRegistry implements Serializable{ * @return {@link ConverterRegistry} */ public static ConverterRegistry getInstance() { - return SingletonHolder.instance; + return SingletonHolder.INSTANCE; } public ConverterRegistry() { diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/BooleanConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/BooleanConverter.java index a205369cd..44368e78f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/BooleanConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/BooleanConverter.java @@ -13,11 +13,8 @@ public class BooleanConverter extends AbstractConverter{ @Override protected Boolean convertInternal(Object value) { - if(boolean.class == value.getClass()){ - return Boolean.valueOf((boolean)value); - } - String valueStr = convertToStr(value); - return Boolean.valueOf(BooleanUtil.toBoolean(valueStr)); + //Object不可能出现Primitive类型,故忽略 + return BooleanUtil.toBoolean(convertToStr(value)); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/CharacterConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/CharacterConverter.java index a641aa7f1..8b3707cc9 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/CharacterConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/CharacterConverter.java @@ -15,16 +15,12 @@ public class CharacterConverter extends AbstractConverter { @Override protected Character convertInternal(Object value) { - if (char.class == value.getClass()) { - return Character.valueOf((char) value); - } else if (value instanceof Boolean) { + if (value instanceof Boolean) { return BooleanUtil.toCharacter((Boolean) value); - } else if (boolean.class == value.getClass()) { - return BooleanUtil.toCharacter((boolean) value); } else { final String valueStr = convertToStr(value); if (StrUtil.isNotBlank(valueStr)) { - return Character.valueOf(valueStr.charAt(0)); + return valueStr.charAt(0); } } return null; diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java index 1ee9350c4..f9f0132ff 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/DateConverter.java @@ -18,7 +18,7 @@ import java.util.Date; public class DateConverter extends AbstractConverter { private static final long serialVersionUID = 1L; - private Class targetType; + private final Class targetType; /** 日期格式化 */ private String format; diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/EnumConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/EnumConverter.java index 1b4d5618b..292dc04c4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/EnumConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/EnumConverter.java @@ -25,7 +25,7 @@ public class EnumConverter extends AbstractConverter { private static final Map, Map, Method>> VALUE_OF_METHOD_CACHE = new ConcurrentHashMap<>(); - private Class enumClass; + private final Class enumClass; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/GenericEnumConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/GenericEnumConverter.java index 4e6f289d8..7291f55e0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/GenericEnumConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/GenericEnumConverter.java @@ -14,7 +14,7 @@ import cn.hutool.core.convert.AbstractConverter; public class GenericEnumConverter> extends AbstractConverter { private static final long serialVersionUID = 1L; - private Class enumClass; + private final Class enumClass; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java index 50263664a..b102c0274 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/NumberConverter.java @@ -1,15 +1,15 @@ package cn.hutool.core.convert.impl; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; - import cn.hutool.core.convert.AbstractConverter; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; + /** * 数字转换器
* 支持类型为:
@@ -30,7 +30,7 @@ import cn.hutool.core.util.StrUtil; public class NumberConverter extends AbstractConverter { private static final long serialVersionUID = 1L; - private Class targetType; + private final Class targetType; public NumberConverter() { this.targetType = Number.class; @@ -50,7 +50,7 @@ public class NumberConverter extends AbstractConverter { final Class targetType = this.targetType; if (Byte.class == targetType) { if (value instanceof Number) { - return Byte.valueOf(((Number) value).byteValue()); + return ((Number) value).byteValue(); } else if(value instanceof Boolean) { return BooleanUtil.toByteObj((Boolean)value); } @@ -59,7 +59,7 @@ public class NumberConverter extends AbstractConverter { } else if (Short.class == targetType) { if (value instanceof Number) { - return Short.valueOf(((Number) value).shortValue()); + return ((Number) value).shortValue(); } else if(value instanceof Boolean) { return BooleanUtil.toShortObj((Boolean)value); } @@ -68,12 +68,12 @@ public class NumberConverter extends AbstractConverter { } else if (Integer.class == targetType) { if (value instanceof Number) { - return Integer.valueOf(((Number) value).intValue()); + return ((Number) value).intValue(); } else if(value instanceof Boolean) { return BooleanUtil.toInteger((Boolean)value); } final String valueStr = convertToStr(value); - return StrUtil.isBlank(valueStr) ? null : Integer.valueOf(NumberUtil.parseInt(valueStr)); + return StrUtil.isBlank(valueStr) ? null : NumberUtil.parseInt(valueStr); } else if (AtomicInteger.class == targetType) { final AtomicInteger intValue = new AtomicInteger(); @@ -90,12 +90,12 @@ public class NumberConverter extends AbstractConverter { return intValue; } else if (Long.class == targetType) { if (value instanceof Number) { - return Long.valueOf(((Number) value).longValue()); + return ((Number) value).longValue(); } else if(value instanceof Boolean) { return BooleanUtil.toLongObj((Boolean)value); } final String valueStr = convertToStr(value); - return StrUtil.isBlank(valueStr) ? null : Long.valueOf(NumberUtil.parseLong(valueStr)); + return StrUtil.isBlank(valueStr) ? null : NumberUtil.parseLong(valueStr); } else if (AtomicLong.class == targetType) { final AtomicLong longValue = new AtomicLong(); @@ -113,7 +113,7 @@ public class NumberConverter extends AbstractConverter { } else if (Float.class == targetType) { if (value instanceof Number) { - return Float.valueOf(((Number) value).floatValue()); + return ((Number) value).floatValue(); } else if(value instanceof Boolean) { return BooleanUtil.toFloatObj((Boolean)value); } @@ -122,7 +122,7 @@ public class NumberConverter extends AbstractConverter { } else if (Double.class == targetType) { if (value instanceof Number) { - return Double.valueOf(((Number) value).doubleValue()); + return ((Number) value).doubleValue(); } else if(value instanceof Boolean) { return BooleanUtil.toDoubleObj((Boolean)value); } diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/PrimitiveConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/PrimitiveConverter.java index ee3a95f31..a8dd0b987 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/PrimitiveConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/PrimitiveConverter.java @@ -29,7 +29,7 @@ import java.util.Date; public class PrimitiveConverter extends AbstractConverter { private static final long serialVersionUID = 1L; - private Class targetType; + private final Class targetType; /** * 构造
diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/ReferenceConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/ReferenceConverter.java index 8dd269a9f..b9bbd42ce 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/ReferenceConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/ReferenceConverter.java @@ -1,15 +1,15 @@ package cn.hutool.core.convert.impl; -import java.lang.ref.Reference; -import java.lang.ref.SoftReference; -import java.lang.ref.WeakReference; -import java.lang.reflect.Type; - import cn.hutool.core.convert.AbstractConverter; import cn.hutool.core.convert.ConverterRegistry; import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.TypeUtil; +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; +import java.lang.ref.WeakReference; +import java.lang.reflect.Type; + /** * {@link Reference}转换器 * @@ -20,7 +20,7 @@ import cn.hutool.core.util.TypeUtil; public class ReferenceConverter extends AbstractConverter { private static final long serialVersionUID = 1L; - private Class targetType; + private final Class targetType; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java b/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java index 8943fb888..af6331626 100644 --- a/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java +++ b/hutool-core/src/main/java/cn/hutool/core/convert/impl/TemporalAccessorConverter.java @@ -39,7 +39,7 @@ import java.util.Objects; public class TemporalAccessorConverter extends AbstractConverter { private static final long serialVersionUID = 1L; - private Class targetType; + private final Class targetType; /** * 日期格式化 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateBetween.java b/hutool-core/src/main/java/cn/hutool/core/date/DateBetween.java index ff2a5ed84..47c01fe3f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateBetween.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateBetween.java @@ -16,9 +16,9 @@ public class DateBetween implements Serializable{ private static final long serialVersionUID = 1L; /** 开始日期 */ - private Date begin; + private final Date begin; /** 结束日期 */ - private Date end; + private final Date end; /** * 创建
diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateField.java b/hutool-core/src/main/java/cn/hutool/core/date/DateField.java index d5b2b07f3..c8c572837 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateField.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateField.java @@ -103,7 +103,7 @@ public enum DateField { MILLISECOND(Calendar.MILLISECOND); // --------------------------------------------------------------- - private int value; + private final int value; DateField(int value) { this.value = value; diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUnit.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUnit.java index 13a36c71d..2f2a58544 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUnit.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUnit.java @@ -19,7 +19,7 @@ public enum DateUnit { /**一周的毫秒数 */ WEEK(DAY.getMillis() * 7); - private long millis; + private final long millis; DateUnit(long millis){ this.millis = millis; } diff --git a/hutool-core/src/main/java/cn/hutool/core/date/Month.java b/hutool-core/src/main/java/cn/hutool/core/date/Month.java index 9d64b9e15..3c35608d0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/Month.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/Month.java @@ -53,7 +53,7 @@ public enum Month { UNDECIMBER(Calendar.UNDECIMBER); // --------------------------------------------------------------- - private int value; + private final int value; Month(int value) { this.value = value; diff --git a/hutool-core/src/main/java/cn/hutool/core/date/Quarter.java b/hutool-core/src/main/java/cn/hutool/core/date/Quarter.java index 0382e6160..d735011c5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/Quarter.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/Quarter.java @@ -23,7 +23,7 @@ public enum Quarter { Q4(4); // --------------------------------------------------------------- - private int value; + private final int value; Quarter(int value) { this.value = value; diff --git a/hutool-core/src/main/java/cn/hutool/core/date/SystemClock.java b/hutool-core/src/main/java/cn/hutool/core/date/SystemClock.java index d70842140..502acc67a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/SystemClock.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/SystemClock.java @@ -26,7 +26,7 @@ public class SystemClock { * 构造 * @param period 时钟更新间隔,单位毫秒 */ - private SystemClock(long period) { + public SystemClock(long period) { this.period = period; this.now = System.currentTimeMillis(); scheduleClockUpdating(); diff --git a/hutool-core/src/main/java/cn/hutool/core/date/TimeInterval.java b/hutool-core/src/main/java/cn/hutool/core/date/TimeInterval.java index 896c47de1..8edd5cfe8 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/TimeInterval.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/TimeInterval.java @@ -12,7 +12,7 @@ public class TimeInterval implements Serializable { private static final long serialVersionUID = 1L; private long time; - private boolean isNano; + private final boolean isNano; /** * 构造,默认使用毫秒计数 diff --git a/hutool-core/src/main/java/cn/hutool/core/date/Week.java b/hutool-core/src/main/java/cn/hutool/core/date/Week.java index af1c8add1..e4282f43a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/Week.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/Week.java @@ -36,7 +36,7 @@ public enum Week { // --------------------------------------------------------------- /** 星期对应{@link Calendar} 中的Week值 */ - private int value; + private final int value; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java b/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java index 9f6dd33d9..00db5b766 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/format/FastDatePrinter.java @@ -1,5 +1,7 @@ package cn.hutool.core.date.format; +import cn.hutool.core.date.DateException; + import java.io.IOException; import java.io.ObjectInputStream; import java.text.DateFormatSymbols; @@ -12,8 +14,6 @@ import java.util.TimeZone; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -import cn.hutool.core.date.DateException; - /** * {@link java.text.SimpleDateFormat} 的线程安全版本,用于将 {@link Date} 格式化输出
* Thanks to Apache Commons Lang 3.5 @@ -48,7 +48,7 @@ class FastDatePrinter extends AbstractDateBasic implements DatePrinter { */ private void init() { final List rulesList = parsePattern(); - rules = rulesList.toArray(new Rule[rulesList.size()]); + rules = rulesList.toArray(new Rule[0]); int len = 0; for (int i = rules.length; --i >= 0;) { diff --git a/hutool-core/src/main/java/cn/hutool/core/img/Img.java b/hutool-core/src/main/java/cn/hutool/core/img/Img.java index 3233751c8..4438a634f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/Img.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/Img.java @@ -47,7 +47,7 @@ import java.nio.file.Path; public class Img implements Serializable { private static final long serialVersionUID = 1L; - private BufferedImage srcImage; + private final BufferedImage srcImage; private Image targetImage; /** * 目标图片文件格式,用于写出 diff --git a/hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java b/hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java index ed8eb8724..d96048879 100644 --- a/hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java +++ b/hutool-core/src/main/java/cn/hutool/core/img/ScaleType.java @@ -35,7 +35,7 @@ public enum ScaleType { this.value = value; } - private int value; + private final int value; public int getValue() { return this.value; diff --git a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java index 0390eff9f..a85e2ae19 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/FileUtil.java @@ -82,7 +82,7 @@ public class FileUtil { /** * Windows下文件名中的无效字符 */ - private static Pattern FILE_NAME_INVALID_PATTERN_WIN = Pattern.compile("[\\\\/:*?\"<>|]"); + private static final Pattern FILE_NAME_INVALID_PATTERN_WIN = Pattern.compile("[\\\\/:*?\"<>|]"); /** * Class文件扩展名 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/FileAppender.java b/hutool-core/src/main/java/cn/hutool/core/io/file/FileAppender.java index 51a61a00f..1c0b087af 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/FileAppender.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/FileAppender.java @@ -1,5 +1,7 @@ package cn.hutool.core.io.file; +import cn.hutool.core.util.CharsetUtil; + import java.io.File; import java.io.PrintWriter; import java.io.Serializable; @@ -7,8 +9,6 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; -import cn.hutool.core.util.CharsetUtil; - /** * 文件追加器
* 持有一个文件,在内存中积累一定量的数据后统一追加到文件
@@ -21,12 +21,12 @@ import cn.hutool.core.util.CharsetUtil; public class FileAppender implements Serializable{ private static final long serialVersionUID = 1L; - private FileWriter writer; + private final FileWriter writer; /** 内存中持有的字符串数 */ - private int capacity; + private final int capacity; /** 追加内容是否为新行 */ - private boolean isNewLineMode; - private List list = new ArrayList<>(100); + private final boolean isNewLineMode; + private final List list = new ArrayList<>(100); /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/LineReadWatcher.java b/hutool-core/src/main/java/cn/hutool/core/io/file/LineReadWatcher.java index 18cc739b7..f0f83d05a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/LineReadWatcher.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/LineReadWatcher.java @@ -1,16 +1,16 @@ package cn.hutool.core.io.file; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.LineHandler; +import cn.hutool.core.io.watch.SimpleWatcher; + import java.io.IOException; import java.io.RandomAccessFile; import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.WatchEvent; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.io.LineHandler; -import cn.hutool.core.io.watch.SimpleWatcher; - /** * 行处理的Watcher实现 * @@ -19,9 +19,9 @@ import cn.hutool.core.io.watch.SimpleWatcher; */ public class LineReadWatcher extends SimpleWatcher implements Runnable { - private RandomAccessFile randomAccessFile; - private Charset charset; - private LineHandler lineHandler; + private final RandomAccessFile randomAccessFile; + private final Charset charset; + private final LineHandler lineHandler; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/LineSeparator.java b/hutool-core/src/main/java/cn/hutool/core/io/file/LineSeparator.java index 23441aea3..514a5db0f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/LineSeparator.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/LineSeparator.java @@ -23,7 +23,7 @@ public enum LineSeparator { /** Windows系统换行符:"\r\n" */ WINDOWS("\r\n"); - private String value; + private final String value; LineSeparator(String lineSeparator) { this.value = lineSeparator; diff --git a/hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java b/hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java index f9403eac6..172a65439 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/file/Tailer.java @@ -1,5 +1,14 @@ package cn.hutool.core.io.file; +import cn.hutool.core.date.DateUnit; +import cn.hutool.core.exceptions.UtilException; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.LineHandler; +import cn.hutool.core.lang.Console; +import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.CharsetUtil; + import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; @@ -12,15 +21,6 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -import cn.hutool.core.date.DateUnit; -import cn.hutool.core.exceptions.UtilException; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.io.LineHandler; -import cn.hutool.core.lang.Console; -import cn.hutool.core.util.CharUtil; -import cn.hutool.core.util.CharsetUtil; - /** * 文件内容跟随器,实现类似Linux下"tail -f"命令功能 * @@ -33,16 +33,16 @@ public class Tailer implements Serializable { public static final LineHandler CONSOLE_HANDLER = new ConsoleLineHandler(); /** 编码 */ - private Charset charset; + private final Charset charset; /** 行处理器 */ - private LineHandler lineHandler; + private final LineHandler lineHandler; /** 初始读取的行数 */ - private int initReadLine; + private final int initReadLine; /** 定时任务检查间隔时长 */ - private long period; + private final long period; - private RandomAccessFile randomAccessFile; - private ScheduledExecutorService executorService; + private final RandomAccessFile randomAccessFile; + private final ScheduledExecutorService executorService; /** * 构造,默认UTF-8编码 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/InputStreamResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/InputStreamResource.java index 0955db2ce..10403c9eb 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/InputStreamResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/InputStreamResource.java @@ -1,15 +1,15 @@ package cn.hutool.core.io.resource; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.CharsetUtil; + import java.io.BufferedReader; import java.io.InputStream; import java.io.Serializable; import java.net.URL; import java.nio.charset.Charset; -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.CharsetUtil; - /** * 基于{@link InputStream}的资源获取器
* 注意:此对象中getUrl方法始终返回null @@ -20,8 +20,8 @@ import cn.hutool.core.util.CharsetUtil; public class InputStreamResource implements Resource, Serializable { private static final long serialVersionUID = 1L; - private InputStream in; - private String name; + private final InputStream in; + private final String name; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java index efa737bd7..3d46d64e3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/MultiResource.java @@ -1,5 +1,8 @@ package cn.hutool.core.io.resource; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IORuntimeException; + import java.io.BufferedReader; import java.io.InputStream; import java.io.Serializable; @@ -10,9 +13,6 @@ import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.List; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.IORuntimeException; - /** * 多资源组合资源
* 此资源为一个利用游标自循环资源,只有调用{@link #next()} 方法才会获取下一个资源,使用完毕后调用{@link #reset()}方法重置游标 @@ -23,7 +23,7 @@ import cn.hutool.core.io.IORuntimeException; public class MultiResource implements Resource, Iterable, Iterator, Serializable { private static final long serialVersionUID = 1L; - private List resources; + private final List resources; private int cursor; /** diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/StringResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/StringResource.java index 53a6d108a..e5c04f3bf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/StringResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/StringResource.java @@ -1,5 +1,9 @@ package cn.hutool.core.io.resource; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.CharsetUtil; + import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.InputStream; @@ -8,10 +12,6 @@ import java.io.StringReader; import java.net.URL; import java.nio.charset.Charset; -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.CharsetUtil; - /** * 字符串资源,字符串做为资源 * @@ -21,9 +21,9 @@ import cn.hutool.core.util.CharsetUtil; public class StringResource implements Resource, Serializable { private static final long serialVersionUID = 1L; - private String data; - private String name; - private Charset charset; + private final String data; + private final String name; + private final Charset charset; /** * 构造,使用UTF8编码 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java b/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java index 0707cd294..148a416f0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/resource/UrlResource.java @@ -1,12 +1,5 @@ package cn.hutool.core.io.resource; -import java.io.BufferedReader; -import java.io.File; -import java.io.InputStream; -import java.io.Serializable; -import java.net.URL; -import java.nio.charset.Charset; - import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.IoUtil; @@ -14,6 +7,13 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.URLUtil; +import java.io.BufferedReader; +import java.io.File; +import java.io.InputStream; +import java.io.Serializable; +import java.net.URL; +import java.nio.charset.Charset; + /** * URL资源访问类 * @author Looly @@ -68,7 +68,7 @@ public class UrlResource implements Resource, Serializable{ @Override public InputStream getStream() throws NoResourceException{ if(null == this.url){ - throw new NoResourceException("Resource [{}] not exist!", this.url); + throw new NoResourceException("Resource URL is null!"); } return URLUtil.getStream(url); } diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchKind.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchKind.java index 546dd09ba..a5b639291 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchKind.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchKind.java @@ -45,7 +45,7 @@ public enum WatchKind { DELETE.getValue() //删除 }; - private WatchEvent.Kind value; + private final WatchEvent.Kind value; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchServer.java b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchServer.java index 31ffa0e8a..342ca0cb8 100644 --- a/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchServer.java +++ b/hutool-core/src/main/java/cn/hutool/core/io/watch/WatchServer.java @@ -51,7 +51,7 @@ public class WatchServer extends Thread implements Closeable, Serializable { /** * WatchKey 和 Path的对应表 */ - private Map watchKeyPathMap = new HashMap<>(); + private final Map watchKeyPathMap = new HashMap<>(); /** * 初始化
diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/ClassScanner.java b/hutool-core/src/main/java/cn/hutool/core/lang/ClassScanner.java index b998f9c3c..4e099050c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/ClassScanner.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/ClassScanner.java @@ -2,7 +2,6 @@ package cn.hutool.core.lang; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.EnumerationIter; -import cn.hutool.core.convert.Convert; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.io.resource.ResourceUtil; diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java b/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java index 2b6d28ca8..fa9510594 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Pair.java @@ -1,10 +1,10 @@ package cn.hutool.core.lang; +import cn.hutool.core.clone.CloneSupport; + import java.io.Serializable; import java.util.Objects; -import cn.hutool.core.clone.CloneSupport; - /** * 键值对对象,只能在构造时传入键值 * @@ -17,8 +17,8 @@ import cn.hutool.core.clone.CloneSupport; public class Pair extends CloneSupport> implements Serializable{ private static final long serialVersionUID = 1L; - private K key; - private V value; + private final K key; + private final V value; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java b/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java index 9778c61d3..c56a2e3df 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/PatternPool.java @@ -183,8 +183,8 @@ public class PatternPool { * @author Looly */ private static class RegexWithFlag { - private String regex; - private int flag; + private final String regex; + private final int flag; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Range.java b/hutool-core/src/main/java/cn/hutool/core/lang/Range.java index af6d82bab..6057d5bb9 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Range.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Range.java @@ -1,5 +1,7 @@ package cn.hutool.core.lang; +import cn.hutool.core.thread.lock.NoLock; + import java.io.Serializable; import java.util.Iterator; import java.util.NoSuchElementException; @@ -7,8 +9,6 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import cn.hutool.core.thread.lock.NoLock; - /** * 范围生成器。根据给定的初始值、结束值和步进生成一个步进列表生成器
* 由于用户自行实现{@link Steper}来定义步进,因此Range本身无法判定边界(是否达到end),需在step实现边界判定逻辑。 @@ -27,19 +27,19 @@ public class Range implements Iterable, Iterator, Serializable { /** 锁保证线程安全 */ private Lock lock = new ReentrantLock(); /** 起始对象 */ - private T start; + private final T start; /** 结束对象 */ - private T end; + private final T end; /** 当前对象 */ private T current; /** 下一个对象 */ private T next; /** 步进 */ - private Steper steper; + private final Steper steper; /** 索引 */ private int index = 0; /** 是否包含第一个元素 */ - private boolean includeStart; + private final boolean includeStart; /** 是否包含最后一个元素 */ private boolean includeEnd; diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java b/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java index 0c2cff152..07e31c668 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/SimpleCache.java @@ -8,24 +8,46 @@ import java.util.WeakHashMap; import java.util.concurrent.locks.StampedLock; /** - * 简单缓存,无超时实现,使用{@link WeakHashMap}实现缓存自动清理 - * @author Looly + * 简单缓存,无超时实现,默认使用{@link WeakHashMap}实现缓存自动清理 * * @param 键类型 * @param 值类型 + * @author Looly */ -public class SimpleCache implements Serializable{ +public class SimpleCache implements Serializable { private static final long serialVersionUID = 1L; - - /** 池 */ - private final Map cache = new WeakHashMap<>(); + /** + * 池 + */ + private final Map cache; // 乐观读写锁 - private final StampedLock lock = new StampedLock (); + private final StampedLock lock = new StampedLock(); + + /** + * 构造,默认使用{@link WeakHashMap}实现缓存自动清理 + */ + public SimpleCache() { + this(new WeakHashMap<>()); + } + + /** + * 构造 + *

+ * 通过自定义Map初始化,可以自定义缓存实现。
+ * 比如使用{@link WeakHashMap}则会自动清理key,使用HashMap则不会清理
+ * 同时,传入的Map对象也可以自带初始化的键值对,防止在get时创建 + *

+ * + * @param initMap 初始Map,用于定义Map类型 + */ + public SimpleCache(Map initMap) { + this.cache = initMap; + } /** * 从缓存池中查找值 - * + * * @param key 键 * @return 值 */ @@ -37,27 +59,27 @@ public class SimpleCache implements Serializable{ lock.unlockRead(stamp); } } - + /** * 从缓存中获得对象,当对象不在缓存中或已经过期返回Func0回调产生的对象 - * - * @param key 键 + * + * @param key 键 * @param supplier 如果不存在回调方法,用于生产值对象 * @return 值对象 */ public V get(K key, Func0 supplier) { - if(null == supplier){ + if (null == supplier) { return get(key); } long stamp = lock.readLock(); V v; - try{ + try { v = cache.get(key); if (null == v) { // 尝试转换独占写锁 long writeStamp = lock.tryConvertToWriteLock(stamp); - if(0 == writeStamp){ + if (0 == writeStamp) { // 转换失败,手动更新为写锁 lock.unlockRead(stamp); writeStamp = lock.writeLock(); @@ -65,7 +87,7 @@ public class SimpleCache implements Serializable{ stamp = writeStamp; v = cache.get(key); // 双重检查,防止在竞争锁的过程中已经有其它线程写入 - if(null == v) { + if (null == v) { try { v = supplier.call(); } catch (Exception e) { @@ -79,14 +101,15 @@ public class SimpleCache implements Serializable{ } return v; } - + /** * 放入缓存 - * @param key 键 + * + * @param key 键 * @param value 值 * @return 值 */ - public V put(K key, V value){ + public V put(K key, V value) { // 独占写锁 final long stamp = lock.writeLock(); try { @@ -99,7 +122,7 @@ public class SimpleCache implements Serializable{ /** * 移除缓存 - * + * * @param key 键 * @return 移除的值 */ diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java b/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java index ef9f23b86..c58d3b4d2 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Singleton.java @@ -1,22 +1,21 @@ package cn.hutool.core.lang; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; +import java.util.HashMap; + /** * 单例类
* 提供单例对象的统一管理,当调用get方法时,如果对象池中存在此对象,返回此对象,否则创建新对象返回
- * - * @author loolly * + * @author loolly */ public final class Singleton { - private static Map pool = new ConcurrentHashMap<>(); + + private static final SimpleCache POOL = new SimpleCache<>(new HashMap<>()); private Singleton() { } @@ -25,9 +24,9 @@ public final class Singleton { * 获得指定类的单例对象
* 对象存在于池中返回,否则创建,每次调用此方法获得的对象为同一个对象
* 注意:单例针对的是类和对象,因此get方法第一次调用时创建的对象始终唯一,也就是说就算参数变更,返回的依旧是第一次创建的对象 - * - * @param 单例对象类型 - * @param clazz 类 + * + * @param 单例对象类型 + * @param clazz 类 * @param params 构造方法参数 * @return 单例对象 */ @@ -35,28 +34,16 @@ public final class Singleton { public static T get(Class clazz, Object... params) { Assert.notNull(clazz, "Class must be not null !"); final String key = buildKey(clazz.getName(), params); - T obj = (T) pool.get(key); - - if (null == obj) { - synchronized (Singleton.class) { - obj = (T) pool.get(key); - if (null == obj) { - obj = (T) ReflectUtil.newInstance(clazz, params); - pool.put(key, obj); - } - } - } - - return obj; + return (T) POOL.get(key, () -> ReflectUtil.newInstance(clazz, params)); } /** * 获得指定类的单例对象
* 对象存在于池中返回,否则创建,每次调用此方法获得的对象为同一个对象
- * - * @param 单例对象类型 + * + * @param 单例对象类型 * @param className 类名 - * @param params 构造参数 + * @param params 构造参数 * @return 单例对象 */ public static T get(String className, Object... params) { @@ -67,23 +54,23 @@ public final class Singleton { /** * 将已有对象放入单例中,其Class做为键 - * + * * @param obj 对象 * @since 4.0.7 */ public static void put(Object obj) { Assert.notNull(obj, "Bean object must be not null !"); - pool.put(obj.getClass().getName(), obj); + POOL.put(obj.getClass().getName(), obj); } /** * 移除指定Singleton对象 - * + * * @param clazz 类 */ public static void remove(Class clazz) { if (null != clazz) { - pool.remove(clazz.getName()); + POOL.remove(clazz.getName()); } } @@ -91,15 +78,16 @@ public final class Singleton { * 清除所有Singleton对象 */ public static void destroy() { - pool.clear(); + POOL.clear(); } // ------------------------------------------------------------------------------------------- Private method start + /** * 构建key - * + * * @param className 类名 - * @param params 参数列表 + * @param params 参数列表 * @return key */ private static String buildKey(String className, Object... params) { diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java b/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java index 6b1baa8d5..b39ddb3bd 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/Snowflake.java @@ -51,11 +51,11 @@ public class Snowflake implements Serializable { @SuppressWarnings({"PointlessBitwiseExpression", "FieldCanBeLocal"}) private final long sequenceMask = -1L ^ (-1L << sequenceBits);// 4095 - private long workerId; - private long dataCenterId; + private final long workerId; + private final long dataCenterId; + private final boolean useSystemClock; private long sequence = 0L; private long lastTimestamp = -1L; - private boolean useSystemClock; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/UUID.java b/hutool-core/src/main/java/cn/hutool/core/lang/UUID.java index 8c8805d07..40e993d87 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/UUID.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/UUID.java @@ -1,13 +1,13 @@ package cn.hutool.core.lang; +import cn.hutool.core.util.RandomUtil; +import cn.hutool.core.util.StrUtil; + import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Random; -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; - /** * 提供通用唯一识别码(universally unique identifier)(UUID)实现,UUID表示一个128位的值。
* 此类拷贝自java.util.UUID,用于生成不带-的UUID字符串 @@ -165,15 +165,15 @@ public final class UUID implements java.io.Serializable, Comparable { components[i] = "0x" + components[i]; } - long mostSigBits = Long.decode(components[0]).longValue(); + long mostSigBits = Long.decode(components[0]); mostSigBits <<= 16; - mostSigBits |= Long.decode(components[1]).longValue(); + mostSigBits |= Long.decode(components[1]); mostSigBits <<= 16; - mostSigBits |= Long.decode(components[2]).longValue(); + mostSigBits |= Long.decode(components[2]); - long leastSigBits = Long.decode(components[3]).longValue(); + long leastSigBits = Long.decode(components[3]); leastSigBits <<= 48; - leastSigBits |= Long.decode(components[4]).longValue(); + leastSigBits |= Long.decode(components[4]); return new UUID(mostSigBits, leastSigBits); } @@ -412,11 +412,11 @@ public final class UUID implements java.io.Serializable, Comparable { public int compareTo(UUID val) { // The ordering is intentionally set up so that the UUIDs // can simply be numerically compared as two numbers - return (this.mostSigBits < val.mostSigBits ? -1 : // - (this.mostSigBits > val.mostSigBits ? 1 : // - (this.leastSigBits < val.leastSigBits ? -1 : // - (this.leastSigBits > val.leastSigBits ? 1 : // - 0)))); + int compare = Long.compare(this.mostSigBits, val.mostSigBits); + if(0 == compare){ + compare = Long.compare(this.leastSigBits, val.leastSigBits); + } + return compare; } // ------------------------------------------------------------------------------------------------------------------- Private method start diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/WeightRandom.java b/hutool-core/src/main/java/cn/hutool/core/lang/WeightRandom.java index 630c84a03..fd5f4dd0e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/WeightRandom.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/WeightRandom.java @@ -1,14 +1,14 @@ package cn.hutool.core.lang; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.RandomUtil; + import java.io.Serializable; import java.util.Random; import java.util.SortedMap; import java.util.TreeMap; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.RandomUtil; - /** * 权重随机算法实现
*

@@ -31,8 +31,8 @@ import cn.hutool.core.util.RandomUtil; public class WeightRandom implements Serializable { private static final long serialVersionUID = -8244697995702786499L; - private TreeMap weightMap; - private Random random; + private final TreeMap weightMap; + private final Random random; /** * 创建权重随机获取器 @@ -157,7 +157,7 @@ public class WeightRandom implements Serializable { /** 对象 */ private T obj; /** 权重 */ - private double weight; + private final double weight; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java b/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java index 38ab7d796..f5ab41fe4 100644 --- a/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java +++ b/hutool-core/src/main/java/cn/hutool/core/lang/tree/Tree.java @@ -16,7 +16,7 @@ import java.util.List; public class Tree extends LinkedHashMap implements Node { private static final long serialVersionUID = 1L; - private TreeNodeConfig treeNodeConfig; + private final TreeNodeConfig treeNodeConfig; private Tree parent; public Tree() { diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapBuilder.java b/hutool-core/src/main/java/cn/hutool/core/map/MapBuilder.java index 38779d1da..c2922e78e 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapBuilder.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapBuilder.java @@ -13,7 +13,7 @@ import java.util.Map; public class MapBuilder implements Serializable{ private static final long serialVersionUID = 1L; - private Map map; + private final Map map; /** * 创建Builder,默认HashMap实现 diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java b/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java index 2d9875605..44604ee15 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapProxy.java @@ -1,5 +1,12 @@ package cn.hutool.core.map; +import cn.hutool.core.convert.Convert; +import cn.hutool.core.getter.OptNullBasicTypeFromObjectGetter; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.ClassLoaderUtil; +import cn.hutool.core.util.StrUtil; + import java.io.Serializable; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -8,13 +15,6 @@ import java.util.Collection; import java.util.Map; import java.util.Set; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.getter.OptNullBasicTypeFromObjectGetter; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.BooleanUtil; -import cn.hutool.core.util.ClassLoaderUtil; -import cn.hutool.core.util.StrUtil; - /** * Map代理,提供各种getXXX方法,并提供默认值支持 * @@ -123,7 +123,7 @@ public class MapProxy implements Map, OptNullBasicTypeFromObject final Class[] parameterTypes = method.getParameterTypes(); if (ArrayUtil.isEmpty(parameterTypes)) { final Class returnType = method.getReturnType(); - if (null != returnType && void.class != returnType) { + if (void.class != returnType) { // 匹配Getter final String methodName = method.getName(); String fieldName = null; diff --git a/hutool-core/src/main/java/cn/hutool/core/map/TableMap.java b/hutool-core/src/main/java/cn/hutool/core/map/TableMap.java index 9190bec43..8fcfd9919 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/TableMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/TableMap.java @@ -27,8 +27,8 @@ import java.util.Set; public class TableMap implements Map, Serializable { private static final long serialVersionUID = 1L; - private List keys; - private List values; + private final List keys; + private final List values; /** * 构造 @@ -168,8 +168,8 @@ public class TableMap implements Map, Serializable { private static class Entry implements Map.Entry { - private K key; - private V value; + private final K key; + private final V value; public Entry(K key, V value) { this.key = key; diff --git a/hutool-core/src/main/java/cn/hutool/core/map/TolerantMap.java b/hutool-core/src/main/java/cn/hutool/core/map/TolerantMap.java index 580f39599..d5e67a63d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/TolerantMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/TolerantMap.java @@ -19,185 +19,185 @@ import java.util.function.Function; */ public class TolerantMap extends AbstractMap implements Map, Cloneable, Serializable { - private static final long serialVersionUID = -4158133823263496197L; + private static final long serialVersionUID = -4158133823263496197L; - private transient Map map; + private transient Map map; - private transient V defaultValue; + private transient V defaultValue; - public TolerantMap(V defaultValue) { - this(new HashMap<>(), defaultValue); - } + public TolerantMap(V defaultValue) { + this(new HashMap<>(), defaultValue); + } - public TolerantMap(int initialCapacity, float loadFactor, V defaultValue) { - this(new HashMap<>(initialCapacity, loadFactor), defaultValue); - } + public TolerantMap(int initialCapacity, float loadFactor, V defaultValue) { + this(new HashMap<>(initialCapacity, loadFactor), defaultValue); + } - public TolerantMap(int initialCapacity, V defaultValue) { - this(new HashMap<>(initialCapacity), defaultValue); - } + public TolerantMap(int initialCapacity, V defaultValue) { + this(new HashMap<>(initialCapacity), defaultValue); + } - public TolerantMap(Map map, V defaultValue) { - this.map = map; - this.defaultValue = defaultValue; - } + public TolerantMap(Map map, V defaultValue) { + this.map = map; + this.defaultValue = defaultValue; + } - public static TolerantMap of(Map map, V defaultValue) { - return new TolerantMap<>(map, defaultValue); - } + public static TolerantMap of(Map map, V defaultValue) { + return new TolerantMap<>(map, defaultValue); + } - @Override - public int size() { - return map.size(); - } + @Override + public int size() { + return map.size(); + } - @Override - public boolean isEmpty() { - return map.isEmpty(); - } + @Override + public boolean isEmpty() { + return map.isEmpty(); + } - @Override - public boolean containsValue(Object value) { - return map.containsValue(value); - } + @Override + public boolean containsValue(Object value) { + return map.containsValue(value); + } - @Override - public boolean containsKey(Object key) { - return map.containsKey(key); - } + @Override + public boolean containsKey(Object key) { + return map.containsKey(key); + } - @Override - public V get(Object key) { - return getOrDefault(key, defaultValue); - } + @Override + public V get(Object key) { + return getOrDefault(key, defaultValue); + } - @Override - public V put(K key, V value) { - return map.put(key, value); - } + @Override + public V put(K key, V value) { + return map.put(key, value); + } - @Override - public V remove(Object key) { - return map.remove(key); - } + @Override + public V remove(Object key) { + return map.remove(key); + } - @Override - public void putAll(Map m) { - map.putAll(m); - } + @Override + public void putAll(Map m) { + map.putAll(m); + } - @Override - public void clear() { - map.clear(); - } + @Override + public void clear() { + map.clear(); + } - @Override - public Set keySet() { - return map.keySet(); - } + @Override + public Set keySet() { + return map.keySet(); + } - @Override - public Collection values() { - return map.values(); - } + @Override + public Collection values() { + return map.values(); + } - @Override - public Set> entrySet() { - return map.entrySet(); - } + @Override + public Set> entrySet() { + return map.entrySet(); + } - @Override - public V getOrDefault(Object key, V defaultValue) { - return map.getOrDefault(key, defaultValue); - } + @Override + public V getOrDefault(Object key, V defaultValue) { + return map.getOrDefault(key, defaultValue); + } - @Override - public void forEach(BiConsumer action) { - map.forEach(action); - } + @Override + public void forEach(BiConsumer action) { + map.forEach(action); + } - @Override - public void replaceAll(BiFunction function) { - map.replaceAll(function); - } + @Override + public void replaceAll(BiFunction function) { + map.replaceAll(function); + } - @Override - public V putIfAbsent(K key, V value) { - return map.putIfAbsent(key, value); - } + @Override + public V putIfAbsent(K key, V value) { + return map.putIfAbsent(key, value); + } - @Override - public boolean remove(Object key, Object value) { - return map.remove(key, value); - } + @Override + public boolean remove(Object key, Object value) { + return map.remove(key, value); + } - @Override - public boolean replace(K key, V oldValue, V newValue) { - return map.replace(key, oldValue, newValue); - } + @Override + public boolean replace(K key, V oldValue, V newValue) { + return map.replace(key, oldValue, newValue); + } - @Override - public V replace(K key, V value) { - return map.replace(key, value); - } + @Override + public V replace(K key, V value) { + return map.replace(key, value); + } - @Override - public V computeIfAbsent(K key, Function mappingFunction) { - return map.computeIfAbsent(key, mappingFunction); - } + @Override + public V computeIfAbsent(K key, Function mappingFunction) { + return map.computeIfAbsent(key, mappingFunction); + } - @Override - public V computeIfPresent(K key, BiFunction remappingFunction) { - return map.computeIfPresent(key, remappingFunction); - } + @Override + public V computeIfPresent(K key, BiFunction remappingFunction) { + return map.computeIfPresent(key, remappingFunction); + } - @Override - public V compute(K key, BiFunction remappingFunction) { - return map.compute(key, remappingFunction); - } + @Override + public V compute(K key, BiFunction remappingFunction) { + return map.compute(key, remappingFunction); + } - @Override - public V merge(K key, V value, BiFunction remappingFunction) { - return map.merge(key, value, remappingFunction); - } + @Override + public V merge(K key, V value, BiFunction remappingFunction) { + return map.merge(key, value, remappingFunction); + } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - if (!super.equals(o)) { - return false; - } - TolerantMap that = (TolerantMap) o; - return map.equals(that.map) && Objects.equals(defaultValue, that.defaultValue); - } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + if (!super.equals(o)) { + return false; + } + TolerantMap that = (TolerantMap) o; + return map.equals(that.map) && Objects.equals(defaultValue, that.defaultValue); + } - @Override - public int hashCode() { - return Objects.hash(map, defaultValue); - } + @Override + public int hashCode() { + return Objects.hash(map, defaultValue); + } - @Override - public String toString() { - return "TolerantMap{" + "map=" + map + ", defaultValue=" + defaultValue + '}'; - } + @Override + public String toString() { + return "TolerantMap{" + "map=" + map + ", defaultValue=" + defaultValue + '}'; + } - private void writeObject(ObjectOutputStream s) throws IOException { - s.writeObject(ObjectUtil.serialize(map)); - s.writeObject(ObjectUtil.serialize(defaultValue)); - } + private void writeObject(ObjectOutputStream s) throws IOException { + s.writeObject(ObjectUtil.serialize(map)); + s.writeObject(ObjectUtil.serialize(defaultValue)); + } - private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { - map = ObjectUtil.deserialize((byte[]) s.readObject()); - defaultValue = ObjectUtil.deserialize((byte[]) s.readObject()); - } + private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { + map = ObjectUtil.deserialize((byte[]) s.readObject()); + defaultValue = ObjectUtil.deserialize((byte[]) s.readObject()); + } - @Override - protected Object clone() throws CloneNotSupportedException { - return super.clone(); - } + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/math/Money.java b/hutool-core/src/main/java/cn/hutool/core/math/Money.java index 69d209e29..7845181c9 100644 --- a/hutool-core/src/main/java/cn/hutool/core/math/Money.java +++ b/hutool-core/src/main/java/cn/hutool/core/math/Money.java @@ -77,7 +77,7 @@ public class Money implements Serializable, Comparable { /** * 币种。 */ - private Currency currency; + private final Currency currency; // 构造器 ==================================================== diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java index b24d899b6..ee1f4d942 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ClipboardMonitor.java @@ -1,5 +1,8 @@ package cn.hutool.core.swing.clipboard; +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; + import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.ClipboardOwner; import java.awt.datatransfer.Transferable; @@ -7,9 +10,6 @@ import java.io.Closeable; import java.util.LinkedHashSet; import java.util.Set; -import cn.hutool.core.thread.ThreadUtil; -import cn.hutool.core.util.ObjectUtil; - /** * 剪贴板监听 * @@ -189,6 +189,7 @@ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { for (int i = 0; i < this.tryCount; i++) { if (this.delay > 0 && i > 0) { // 第一次获取不等待,只有从第二次获取时才开始等待 + //noinspection BusyWait Thread.sleep(this.delay); } @@ -201,7 +202,7 @@ public enum ClipboardMonitor implements ClipboardOwner, Runnable, Closeable { return newContents; } } - return newContents; + return null; } // ------------------------------------------------------------------------------------------------------------------------- Private method end } diff --git a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ImageSelection.java b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ImageSelection.java index 21380df85..ea656307a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ImageSelection.java +++ b/hutool-core/src/main/java/cn/hutool/core/swing/clipboard/ImageSelection.java @@ -4,7 +4,6 @@ import java.awt.Image; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; -import java.io.IOException; import java.io.Serializable; /** @@ -17,7 +16,7 @@ import java.io.Serializable; public class ImageSelection implements Transferable, Serializable { private static final long serialVersionUID = 1L; - private Image image; + private final Image image; /** * 构造 @@ -56,7 +55,7 @@ public class ImageSelection implements Transferable, Serializable { * @return 转换后的对象 */ @Override - public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException { if (false == DataFlavor.imageFlavor.equals(flavor)) { throw new UnsupportedFlavorException(flavor); } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/Simhash.java b/hutool-core/src/main/java/cn/hutool/core/text/Simhash.java index 74aa9fed4..a1fc9f191 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/Simhash.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/Simhash.java @@ -1,16 +1,14 @@ package cn.hutool.core.text; +import cn.hutool.core.lang.hash.MurmurHash; + import java.math.BigInteger; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; -import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock; - -import cn.hutool.core.lang.hash.MurmurHash; +import java.util.concurrent.locks.StampedLock; /** *

@@ -35,8 +33,8 @@ public class Simhash { private final int hammingThresh; /** 按照分段存储simhash,查找更快速 */ - private List>> storage; - private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + private final List>> storage; + private final StampedLock lock = new StampedLock(); /** * 构造 @@ -57,7 +55,7 @@ public class Simhash { this.hammingThresh = hammingThresh; this.storage = new ArrayList<>(fracCount); for (int i = 0; i < fracCount; i++) { - storage.add(new HashMap>()); + storage.add(new HashMap<>()); } } @@ -104,8 +102,7 @@ public class Simhash { String frac; Map> fracMap; - final ReadLock readLock = this.lock.readLock(); - readLock.lock(); + final long stamp = this.lock.readLock(); try { for (int i = 0; i < fracCount; i++) { frac = fracList.get(i); @@ -120,7 +117,7 @@ public class Simhash { } } } finally { - readLock.unlock(); + this.lock.unlockRead(stamp); } return false; } @@ -137,8 +134,7 @@ public class Simhash { String frac; Map> fracMap; - final WriteLock writeLock = this.lock.writeLock(); - writeLock.lock(); + final long stamp = this.lock.writeLock(); try { for (int i = 0; i < fracCount; i++) { frac = lFrac.get(i); @@ -152,7 +148,7 @@ public class Simhash { } } } finally { - writeLock.unlock(); + this.lock.unlockWrite(stamp); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/StrSpliter.java b/hutool-core/src/main/java/cn/hutool/core/text/StrSpliter.java index cccafb1fc..35aa70a8a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/StrSpliter.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/StrSpliter.java @@ -1,15 +1,15 @@ package cn.hutool.core.text; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import cn.hutool.core.lang.PatternPool; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * 字符串切分器 * @author Looly @@ -149,10 +149,10 @@ public class StrSpliter { */ public static List split(String str, char separator, int limit, boolean isTrim, boolean ignoreEmpty, boolean ignoreCase){ if(StrUtil.isEmpty(str)){ - return new ArrayList(0); + return new ArrayList<>(0); } if(limit == 1){ - return addToList(new ArrayList(1), str, isTrim, ignoreEmpty); + return addToList(new ArrayList<>(1), str, isTrim, ignoreEmpty); } final ArrayList list = new ArrayList<>(limit > 0 ? limit : 16); @@ -288,10 +288,10 @@ public class StrSpliter { */ public static List split(String str, String separator, int limit, boolean isTrim, boolean ignoreEmpty, boolean ignoreCase){ if(StrUtil.isEmpty(str)){ - return new ArrayList(0); + return new ArrayList<>(0); } if(limit == 1){ - return addToList(new ArrayList(1), str, isTrim, ignoreEmpty); + return addToList(new ArrayList<>(1), str, isTrim, ignoreEmpty); } if(StrUtil.isEmpty(separator)){//分隔符为空时按照空白符切分 @@ -350,10 +350,10 @@ public class StrSpliter { */ public static List split(String str, int limit){ if(StrUtil.isEmpty(str)){ - return new ArrayList(0); + return new ArrayList<>(0); } if(limit == 1){ - return addToList(new ArrayList(1), str, true, true); + return addToList(new ArrayList<>(1), str, true, true); } final ArrayList list = new ArrayList<>(); @@ -413,10 +413,10 @@ public class StrSpliter { */ public static List split(String str, Pattern separatorPattern, int limit, boolean isTrim, boolean ignoreEmpty){ if(StrUtil.isEmpty(str)){ - return new ArrayList(0); + return new ArrayList<>(0); } if(limit == 1){ - return addToList(new ArrayList(1), str, isTrim, ignoreEmpty); + return addToList(new ArrayList<>(1), str, isTrim, ignoreEmpty); } if(null == separatorPattern){//分隔符为空时按照空白符切分 @@ -507,7 +507,7 @@ public class StrSpliter { * @return Array */ private static String[] toArray(List list){ - return list.toArray(new String[list.size()]); + return list.toArray(new String[0]); } //---------------------------------------------------------------------------------------------------------- Private method end } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/UnicodeUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/UnicodeUtil.java index e2cb31f8b..7c9cd6d46 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/UnicodeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/UnicodeUtil.java @@ -43,7 +43,7 @@ public class UnicodeUtil { pos = i + 2; } } else { - pos = i;//非Unicode符,结束 + //非Unicode符,结束 break; } } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvParser.java b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvParser.java index 09ed65a08..0ccd01a16 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvParser.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/csv/CsvParser.java @@ -1,5 +1,12 @@ package cn.hutool.core.text.csv; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.text.StrBuilder; +import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; + import java.io.Closeable; import java.io.IOException; import java.io.Reader; @@ -11,13 +18,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.text.StrBuilder; -import cn.hutool.core.util.CharUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; - /** * CSV行解析器,参考:FastCSV * @@ -96,12 +96,8 @@ public final class CsvParser implements Closeable, Serializable { while (false == finished) { startingLineNo = ++lineNo; currentFields = readLine(); - if(null == currentFields) { - break; - } fieldCount = currentFields.size(); - // 末尾 - if (fieldCount == 0) { + if(fieldCount < 1){ break; } diff --git a/hutool-core/src/main/java/cn/hutool/core/text/escape/NumericEntityUnescaper.java b/hutool-core/src/main/java/cn/hutool/core/text/escape/NumericEntityUnescaper.java index fa5e82780..b9d274241 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/escape/NumericEntityUnescaper.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/escape/NumericEntityUnescaper.java @@ -48,7 +48,7 @@ public class NumericEntityUnescaper extends StrReplacer { return 0; } out.append((char)entityValue); - return 2 + end - start + (isHex ? 1 : 0) + (isSemiNext ? 1 : 0); + return 2 + end - start + (isHex ? 1 : 0) + 1; } } return 0; diff --git a/hutool-core/src/main/java/cn/hutool/core/text/replacer/ReplacerChain.java b/hutool-core/src/main/java/cn/hutool/core/text/replacer/ReplacerChain.java index 9cac7ee26..4729948ac 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/replacer/ReplacerChain.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/replacer/ReplacerChain.java @@ -1,12 +1,12 @@ package cn.hutool.core.text.replacer; +import cn.hutool.core.lang.Chain; +import cn.hutool.core.text.StrBuilder; + import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import cn.hutool.core.lang.Chain; -import cn.hutool.core.text.StrBuilder; - /** * 字符串替换链,用于组合多个字符串替换逻辑 * @@ -16,7 +16,7 @@ import cn.hutool.core.text.StrBuilder; public class ReplacerChain extends StrReplacer implements Chain { private static final long serialVersionUID = 1L; - private List replacers = new LinkedList<>(); + private final List replacers = new LinkedList<>(); /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/ConcurrencyTester.java b/hutool-core/src/main/java/cn/hutool/core/thread/ConcurrencyTester.java index 1673054be..20b42f4ee 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/ConcurrencyTester.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/ConcurrencyTester.java @@ -17,8 +17,8 @@ import cn.hutool.core.date.TimeInterval; * @author kwer */ public class ConcurrencyTester { - private SyncFinisher sf; - private TimeInterval timeInterval; + private final SyncFinisher sf; + private final TimeInterval timeInterval; private long interval; public ConcurrencyTester(int threadSize) { diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/RejectPolicy.java b/hutool-core/src/main/java/cn/hutool/core/thread/RejectPolicy.java index 0babcb018..c95545985 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/RejectPolicy.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/RejectPolicy.java @@ -23,7 +23,7 @@ public enum RejectPolicy { /** 由主线程来直接执行 */ CALLER_RUNS(new ThreadPoolExecutor.CallerRunsPolicy()); - private RejectedExecutionHandler value; + private final RejectedExecutionHandler value; RejectPolicy(RejectedExecutionHandler handler) { this.value = handler; diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/SemaphoreRunnable.java b/hutool-core/src/main/java/cn/hutool/core/thread/SemaphoreRunnable.java index 9cdcfc304..22cac27b0 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/SemaphoreRunnable.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/SemaphoreRunnable.java @@ -16,9 +16,9 @@ import java.util.concurrent.Semaphore; public class SemaphoreRunnable implements Runnable { /** 实际执行的逻辑 */ - private Runnable runnable; + private final Runnable runnable; /** 信号量 */ - private Semaphore semaphore; + private final Semaphore semaphore; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java b/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java index e4127f48f..8555a7dbc 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/SyncFinisher.java @@ -1,13 +1,13 @@ package cn.hutool.core.thread; +import cn.hutool.core.exceptions.NotInitedException; +import cn.hutool.core.exceptions.UtilException; + import java.util.LinkedHashSet; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; -import cn.hutool.core.exceptions.NotInitedException; -import cn.hutool.core.exceptions.UtilException; - /** * 线程同步结束器
* 在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 @@ -27,13 +27,13 @@ import cn.hutool.core.exceptions.UtilException; */ public class SyncFinisher { - private Set workers; - private int threadSize; - private ExecutorService executorService; + private final Set workers; + private final int threadSize; + private final ExecutorService executorService; private boolean isBeginAtSameTime; /** 启动同步器,用于保证所有worker线程同时开始 */ - private CountDownLatch beginLatch; + private final CountDownLatch beginLatch; /** 结束同步器,用于等待所有worker线程同时结束 */ private CountDownLatch endLatch; diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/lock/LockUtil.java b/hutool-core/src/main/java/cn/hutool/core/thread/lock/LockUtil.java index 051134330..12191a31f 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/lock/LockUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/lock/LockUtil.java @@ -11,7 +11,7 @@ import java.util.concurrent.locks.StampedLock; */ public class LockUtil { - private static NoLock NO_LOCK = new NoLock(); + private static final NoLock NO_LOCK = new NoLock(); /** * 创建{@link StampedLock}锁 diff --git a/hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java b/hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java index 912d21359..7f67b73cc 100644 --- a/hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java +++ b/hutool-core/src/main/java/cn/hutool/core/thread/lock/NoLock.java @@ -38,7 +38,7 @@ public class NoLock implements Lock{ @SuppressWarnings("NullableProblems") @Override public Condition newCondition() { - return null; + throw new UnsupportedOperationException("NoLock`s newCondition method is unsupported"); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/IdUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/IdUtil.java index b7bca158f..bdb76fb32 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/IdUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/IdUtil.java @@ -7,23 +7,24 @@ import cn.hutool.core.lang.UUID; /** * ID生成器工具类,此工具类中主要封装: - * + * *

  * 1. 唯一性ID生成器:UUID、ObjectId(MongoDB)、Snowflake
  * 
- * + * *

* ID相关文章见:http://calvin1978.blogcn.com/articles/uuid.html - * + * * @author looly * @since 4.1.13 */ public class IdUtil { // ------------------------------------------------------------------- UUID + /** * 获取随机UUID - * + * * @return 随机UUID */ public static String randomUUID() { @@ -32,7 +33,7 @@ public class IdUtil { /** * 简化的UUID,去掉了横线 - * + * * @return 简化的UUID,去掉了横线 */ public static String simpleUUID() { @@ -41,7 +42,7 @@ public class IdUtil { /** * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID - * + * * @return 随机UUID * @since 4.1.19 */ @@ -51,7 +52,7 @@ public class IdUtil { /** * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID - * + * * @return 简化的UUID,去掉了横线 * @since 4.1.19 */ @@ -62,16 +63,16 @@ public class IdUtil { /** * 创建MongoDB ID生成策略实现
* ObjectId由以下几部分组成: - * + * *

 	 * 1. Time 时间戳。
 	 * 2. Machine 所在主机的唯一标识符,一般是机器主机名的散列值。
 	 * 3. PID 进程ID。确保同一机器中不冲突
 	 * 4. INC 自增计数器。确保同一秒内产生objectId的唯一性。
 	 * 
- * + *

* 参考:http://blog.csdn.net/qxc1281/article/details/54021882 - * + * * @return ObjectId */ public static String objectId() { @@ -79,24 +80,27 @@ public class IdUtil { } /** - * 创建Twitter的Snowflake 算法生成器
+ * 创建Twitter的Snowflake 算法生成器。 + *

+ * 特别注意:此方法调用后会创建独立的{@link Snowflake}对象,每个独立的对象ID不互斥,会导致ID重复,请自行保证单例! + *

* 分布式系统中,有一些需要使用全局唯一ID的场景,有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。 - * + * *

* snowflake的结构如下(每部分用-分开):
- * + * *

 	 * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
 	 * 
- * + *

* 第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以使用69年)
* 然后是5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点)
* 最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) - * + * *

* 参考:http://www.cnblogs.com/relucent/p/4955340.html - * - * @param workerId 终端ID + * + * @param workerId 终端ID * @param datacenterId 数据中心ID * @return {@link Snowflake} */ @@ -107,22 +111,22 @@ public class IdUtil { /** * 获取单例的Twitter的Snowflake 算法生成器对象
* 分布式系统中,有一些需要使用全局唯一ID的场景,有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。 - * + * *

* snowflake的结构如下(每部分用-分开):
- * + * *

 	 * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
 	 * 
- * + *

* 第一位为未使用,接下来的41位为毫秒级时间(41位的长度可以使用69年)
* 然后是5位datacenterId和5位workerId(10位的长度最多支持部署1024个节点)
* 最后12位是毫秒内的计数(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号) - * + * *

* 参考:http://www.cnblogs.com/relucent/p/4955340.html - * - * @param workerId 终端ID + * + * @param workerId 终端ID * @param datacenterId 数据中心ID * @return {@link Snowflake} * @since 4.5.9 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java index e4fd48a7e..c29f6ff49 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/IdcardUtil.java @@ -41,91 +41,91 @@ public class IdcardUtil { /** * 省市代码表 */ - private static Map cityCodes = new HashMap<>(); + private static final Map CITY_CODES = new HashMap<>(); /** * 台湾身份首字母对应数字 */ - private static Map twFirstCode = new HashMap<>(); + private static final Map TW_FIRST_CODE = new HashMap<>(); /** * 香港身份首字母对应数字 */ - private static Map hkFirstCode = new HashMap<>(); + private static final Map HK_FIRST_CODE = new HashMap<>(); static { - cityCodes.put("11", "北京"); - cityCodes.put("12", "天津"); - cityCodes.put("13", "河北"); - cityCodes.put("14", "山西"); - cityCodes.put("15", "内蒙古"); - cityCodes.put("21", "辽宁"); - cityCodes.put("22", "吉林"); - cityCodes.put("23", "黑龙江"); - cityCodes.put("31", "上海"); - cityCodes.put("32", "江苏"); - cityCodes.put("33", "浙江"); - cityCodes.put("34", "安徽"); - cityCodes.put("35", "福建"); - cityCodes.put("36", "江西"); - cityCodes.put("37", "山东"); - cityCodes.put("41", "河南"); - cityCodes.put("42", "湖北"); - cityCodes.put("43", "湖南"); - cityCodes.put("44", "广东"); - cityCodes.put("45", "广西"); - cityCodes.put("46", "海南"); - cityCodes.put("50", "重庆"); - cityCodes.put("51", "四川"); - cityCodes.put("52", "贵州"); - cityCodes.put("53", "云南"); - cityCodes.put("54", "西藏"); - cityCodes.put("61", "陕西"); - cityCodes.put("62", "甘肃"); - cityCodes.put("63", "青海"); - cityCodes.put("64", "宁夏"); - cityCodes.put("65", "新疆"); - cityCodes.put("71", "台湾"); - cityCodes.put("81", "香港"); - cityCodes.put("82", "澳门"); - cityCodes.put("91", "国外"); + CITY_CODES.put("11", "北京"); + CITY_CODES.put("12", "天津"); + CITY_CODES.put("13", "河北"); + CITY_CODES.put("14", "山西"); + CITY_CODES.put("15", "内蒙古"); + CITY_CODES.put("21", "辽宁"); + CITY_CODES.put("22", "吉林"); + CITY_CODES.put("23", "黑龙江"); + CITY_CODES.put("31", "上海"); + CITY_CODES.put("32", "江苏"); + CITY_CODES.put("33", "浙江"); + CITY_CODES.put("34", "安徽"); + CITY_CODES.put("35", "福建"); + CITY_CODES.put("36", "江西"); + CITY_CODES.put("37", "山东"); + CITY_CODES.put("41", "河南"); + CITY_CODES.put("42", "湖北"); + CITY_CODES.put("43", "湖南"); + CITY_CODES.put("44", "广东"); + CITY_CODES.put("45", "广西"); + CITY_CODES.put("46", "海南"); + CITY_CODES.put("50", "重庆"); + CITY_CODES.put("51", "四川"); + CITY_CODES.put("52", "贵州"); + CITY_CODES.put("53", "云南"); + CITY_CODES.put("54", "西藏"); + CITY_CODES.put("61", "陕西"); + CITY_CODES.put("62", "甘肃"); + CITY_CODES.put("63", "青海"); + CITY_CODES.put("64", "宁夏"); + CITY_CODES.put("65", "新疆"); + CITY_CODES.put("71", "台湾"); + CITY_CODES.put("81", "香港"); + CITY_CODES.put("82", "澳门"); + CITY_CODES.put("91", "国外"); - twFirstCode.put("A", 10); - twFirstCode.put("B", 11); - twFirstCode.put("C", 12); - twFirstCode.put("D", 13); - twFirstCode.put("E", 14); - twFirstCode.put("F", 15); - twFirstCode.put("G", 16); - twFirstCode.put("H", 17); - twFirstCode.put("J", 18); - twFirstCode.put("K", 19); - twFirstCode.put("L", 20); - twFirstCode.put("M", 21); - twFirstCode.put("N", 22); - twFirstCode.put("P", 23); - twFirstCode.put("Q", 24); - twFirstCode.put("R", 25); - twFirstCode.put("S", 26); - twFirstCode.put("T", 27); - twFirstCode.put("U", 28); - twFirstCode.put("V", 29); - twFirstCode.put("X", 30); - twFirstCode.put("Y", 31); - twFirstCode.put("W", 32); - twFirstCode.put("Z", 33); - twFirstCode.put("I", 34); - twFirstCode.put("O", 35); + TW_FIRST_CODE.put("A", 10); + TW_FIRST_CODE.put("B", 11); + TW_FIRST_CODE.put("C", 12); + TW_FIRST_CODE.put("D", 13); + TW_FIRST_CODE.put("E", 14); + TW_FIRST_CODE.put("F", 15); + TW_FIRST_CODE.put("G", 16); + TW_FIRST_CODE.put("H", 17); + TW_FIRST_CODE.put("J", 18); + TW_FIRST_CODE.put("K", 19); + TW_FIRST_CODE.put("L", 20); + TW_FIRST_CODE.put("M", 21); + TW_FIRST_CODE.put("N", 22); + TW_FIRST_CODE.put("P", 23); + TW_FIRST_CODE.put("Q", 24); + TW_FIRST_CODE.put("R", 25); + TW_FIRST_CODE.put("S", 26); + TW_FIRST_CODE.put("T", 27); + TW_FIRST_CODE.put("U", 28); + TW_FIRST_CODE.put("V", 29); + TW_FIRST_CODE.put("X", 30); + TW_FIRST_CODE.put("Y", 31); + TW_FIRST_CODE.put("W", 32); + TW_FIRST_CODE.put("Z", 33); + TW_FIRST_CODE.put("I", 34); + TW_FIRST_CODE.put("O", 35); //来自http://shenfenzheng.bajiu.cn/?rid=40 - hkFirstCode.put("A", 1);// 持证人拥有香港居留权 - hkFirstCode.put("B", 2);// 持证人所报称的出生日期或地点自首次登记以后,曾作出更改 - hkFirstCode.put("C", 3);// 持证人登记领证时在香港的居留受到入境事务处处长的限制 - hkFirstCode.put("N", 14);// 持证人所报的姓名自首次登记以后,曾作出更改 - hkFirstCode.put("O", 15);// 持证人报称在香港、澳门及中国以外其他地区或国家出生 - hkFirstCode.put("R", 18);// 持证人拥有香港入境权 - hkFirstCode.put("U", 21);// 持证人登记领证时在香港的居留不受入境事务处处长的限制 - hkFirstCode.put("W", 23);// 持证人报称在澳门地区出生 - hkFirstCode.put("X", 24);// 持证人报称在中国大陆出生 - hkFirstCode.put("Z", 26);// 持证人报称在香港出生 + HK_FIRST_CODE.put("A", 1);// 持证人拥有香港居留权 + HK_FIRST_CODE.put("B", 2);// 持证人所报称的出生日期或地点自首次登记以后,曾作出更改 + HK_FIRST_CODE.put("C", 3);// 持证人登记领证时在香港的居留受到入境事务处处长的限制 + HK_FIRST_CODE.put("N", 14);// 持证人所报的姓名自首次登记以后,曾作出更改 + HK_FIRST_CODE.put("O", 15);// 持证人报称在香港、澳门及中国以外其他地区或国家出生 + HK_FIRST_CODE.put("R", 18);// 持证人拥有香港入境权 + HK_FIRST_CODE.put("U", 21);// 持证人登记领证时在香港的居留不受入境事务处处长的限制 + HK_FIRST_CODE.put("W", 23);// 持证人报称在澳门地区出生 + HK_FIRST_CODE.put("X", 24);// 持证人报称在中国大陆出生 + HK_FIRST_CODE.put("Z", 26);// 持证人报称在香港出生 } /** @@ -248,7 +248,7 @@ public class IdcardUtil { if (ReUtil.isMatch(PatternPool.NUMBERS, idCard)) { // 省份 String proCode = idCard.substring(0, 2); - if (null == cityCodes.get(proCode)) { + if (null == CITY_CODES.get(proCode)) { return false; } @@ -314,7 +314,7 @@ public class IdcardUtil { return false; } String start = idCard.substring(0, 1); - Integer iStart = twFirstCode.get(start); + Integer iStart = TW_FIRST_CODE.get(start); if (null == iStart) { return false; } @@ -352,7 +352,7 @@ public class IdcardUtil { sum = 522 + (Character.toUpperCase(card.charAt(0)) - 55) * 8; } String start = idCard.substring(0, 1); - Integer iStart = hkFirstCode.get(start); + Integer iStart = HK_FIRST_CODE.get(start); if (null == iStart) { return false; } @@ -512,7 +512,7 @@ public class IdcardUtil { int len = idCard.length(); if (len == CHINA_ID_MIN_LENGTH || len == CHINA_ID_MAX_LENGTH) { String sProvinNum = idCard.substring(0, 2); - return cityCodes.get(sProvinNum); + return CITY_CODES.get(sProvinNum); } return null; } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ModifierUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ModifierUtil.java index 26c03a29c..80c81addf 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ModifierUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ModifierUtil.java @@ -45,7 +45,7 @@ public class ModifierUtil { STRICT(Modifier.STRICT); /** 修饰符枚举对应的int修饰符值 */ - private int value; + private final int value; /** * 构造 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java index 69085986d..4ae7360ce 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ObjectUtil.java @@ -569,7 +569,7 @@ public class ObjectUtil { } /** - * 是否存都为{@code null}或空对象,通过{@link ObjectUtil#isEmpty(Object)} 判断元素 + * 是否全都为{@code null}或空对象,通过{@link ObjectUtil#isEmpty(Object)} 判断元素 * * @param objs 被检查的对象,一个或者多个 * @return 是否都为空 @@ -579,7 +579,7 @@ public class ObjectUtil { } /** - * 是否存都不为{@code null}或空对象,通过{@link ObjectUtil#isEmpty(Object)} 判断元素 + * 是否全都不为{@code null}或空对象,通过{@link ObjectUtil#isEmpty(Object)} 判断元素 * * @param objs 被检查的对象,一个或者多个 * @return 是否都不为空 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java index a612534a1..f4d4f4c16 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/RuntimeUtil.java @@ -1,5 +1,8 @@ package cn.hutool.core.util; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; + import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -7,12 +10,9 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.io.IoUtil; - /** * 系统运行时工具类,用于执行系统命令的工具 - * + * * @author Looly * @since 3.1.1 */ @@ -20,7 +20,7 @@ public class RuntimeUtil { /** * 执行系统命令,使用系统默认编码 - * + * * @param cmds 命令列表,每个元素代表一条命令 * @return 执行结果 * @throws IORuntimeException IO异常 @@ -31,9 +31,9 @@ public class RuntimeUtil { /** * 执行系统命令,使用系统默认编码 - * + * * @param charset 编码 - * @param cmds 命令列表,每个元素代表一条命令 + * @param cmds 命令列表,每个元素代表一条命令 * @return 执行结果 * @throws IORuntimeException IO异常 * @since 3.1.2 @@ -44,7 +44,7 @@ public class RuntimeUtil { /** * 执行系统命令,使用系统默认编码 - * + * * @param cmds 命令列表,每个元素代表一条命令 * @return 执行结果,按行区分 * @throws IORuntimeException IO异常 @@ -55,9 +55,9 @@ public class RuntimeUtil { /** * 执行系统命令,使用系统默认编码 - * + * * @param charset 编码 - * @param cmds 命令列表,每个元素代表一条命令 + * @param cmds 命令列表,每个元素代表一条命令 * @return 执行结果,按行区分 * @throws IORuntimeException IO异常 * @since 3.1.2 @@ -69,7 +69,7 @@ public class RuntimeUtil { /** * 执行命令
* 命令带参数时参数可作为其中一个参数,也可以将命令和参数组合为一个字符串传入 - * + * * @param cmds 命令 * @return {@link Process} */ @@ -99,7 +99,7 @@ public class RuntimeUtil { /** * 执行命令
* 命令带参数时参数可作为其中一个参数,也可以将命令和参数组合为一个字符串传入 - * + * * @param envp 环境变量参数,传入形式为key=value,null表示继承系统环境变量 * @param cmds 命令 * @return {@link Process} @@ -112,9 +112,9 @@ public class RuntimeUtil { /** * 执行命令
* 命令带参数时参数可作为其中一个参数,也可以将命令和参数组合为一个字符串传入 - * + * * @param envp 环境变量参数,传入形式为key=value,null表示继承系统环境变量 - * @param dir 执行命令所在目录(用于相对路径命令执行),null表示使用当前进程执行的目录 + * @param dir 执行命令所在目录(用于相对路径命令执行),null表示使用当前进程执行的目录 * @param cmds 命令 * @return {@link Process} * @since 4.1.6 @@ -140,9 +140,10 @@ public class RuntimeUtil { } // -------------------------------------------------------------------------------------------------- result + /** * 获取命令执行结果,使用系统默认编码,获取后销毁进程 - * + * * @param process {@link Process} 进程 * @return 命令执行结果列表 */ @@ -152,7 +153,7 @@ public class RuntimeUtil { /** * 获取命令执行结果,使用系统默认编码,获取后销毁进程 - * + * * @param process {@link Process} 进程 * @param charset 编码 * @return 命令执行结果列表 @@ -162,7 +163,7 @@ public class RuntimeUtil { InputStream in = null; try { in = process.getInputStream(); - return IoUtil.readLines(in, charset, new ArrayList()); + return IoUtil.readLines(in, charset, new ArrayList<>()); } finally { IoUtil.close(in); destroy(process); @@ -171,7 +172,7 @@ public class RuntimeUtil { /** * 获取命令执行结果,使用系统默认编码,,获取后销毁进程 - * + * * @param process {@link Process} 进程 * @return 命令执行结果列表 * @since 3.1.2 @@ -182,7 +183,7 @@ public class RuntimeUtil { /** * 获取命令执行结果,获取后销毁进程 - * + * * @param process {@link Process} 进程 * @param charset 编码 * @return 命令执行结果列表 @@ -201,7 +202,7 @@ public class RuntimeUtil { /** * 获取命令执行异常结果,使用系统默认编码,,获取后销毁进程 - * + * * @param process {@link Process} 进程 * @return 命令执行结果列表 * @since 4.1.21 @@ -212,7 +213,7 @@ public class RuntimeUtil { /** * 获取命令执行异常结果,获取后销毁进程 - * + * * @param process {@link Process} 进程 * @param charset 编码 * @return 命令执行结果列表 @@ -231,7 +232,7 @@ public class RuntimeUtil { /** * 销毁进程 - * + * * @param process 进程 * @since 3.1.2 */ @@ -243,11 +244,61 @@ public class RuntimeUtil { /** * 增加一个JVM关闭后的钩子,用于在JVM关闭时执行某些操作 - * + * * @param hook 钩子 * @since 4.0.5 */ public static void addShutdownHook(Runnable hook) { Runtime.getRuntime().addShutdownHook((hook instanceof Thread) ? (Thread) hook : new Thread(hook)); } + + /** + * 获得JVM可用的处理器数量(一般为CPU核心数) + * + * @return 可用的处理器数量 + * @since 5.3.0 + */ + public static int getProcessorCount() { + return Runtime.getRuntime().availableProcessors(); + } + + /** + * 获得JVM中剩余的内存数,单位byte + * + * @return JVM中剩余的内存数,单位byte + * @since 5.3.0 + */ + public static long getFreeMemory() { + return Runtime.getRuntime().freeMemory(); + } + + /** + * 获得JVM已经从系统中获取到的总共的内存数,单位byte + * + * @return JVM中剩余的内存数,单位byte + * @since 5.3.0 + */ + public static long getTotalMemory() { + return Runtime.getRuntime().totalMemory(); + } + + /** + * 获得JVM中可以从系统中获取的最大的内存数,单位byte,以-Xmx参数为准 + * + * @return JVM中剩余的内存数,单位byte + * @since 5.3.0 + */ + public static long getMaxMemory() { + return Runtime.getRuntime().maxMemory(); + } + + /** + * 获得JVM最大可用内存,计算方法为:
+ * 最大内存-总内存+剩余内存 + * + * @return 最大可用内存 + */ + public final long getUsableMemory() { + return getMaxMemory() - getTotalMemory() + getFreeMemory(); + } } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java index 85cb22443..a4b3eb549 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/TypeUtil.java @@ -59,11 +59,7 @@ public class TypeUtil { if (null == field) { return null; } - Type type = field.getGenericType(); - if (null == type) { - type = field.getType(); - } - return type; + return field.getGenericType(); } /** diff --git a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java index 778a3fbff..eb735c110 100644 --- a/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/convert/ConvertToCollectionTest.java @@ -1,5 +1,10 @@ package cn.hutool.core.convert; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.TypeReference; +import org.junit.Assert; +import org.junit.Test; + import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; @@ -7,12 +12,6 @@ import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; -import org.junit.Assert; -import org.junit.Test; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.TypeReference; - /** * 转换为集合测试 * @@ -107,7 +106,7 @@ public class ConvertToCollectionTest { public void numberToListTest() { Integer i = 1; ArrayList list = Convert.convert(ArrayList.class, i); - Assert.assertTrue(i == list.get(0)); + Assert.assertSame(i, list.get(0)); BigDecimal b = BigDecimal.ONE; ArrayList list2 = Convert.convert(ArrayList.class, b); diff --git a/hutool-core/src/test/java/cn/hutool/core/date/DateTimeTest.java b/hutool-core/src/test/java/cn/hutool/core/date/DateTimeTest.java index f5f10b30d..5795b7897 100644 --- a/hutool-core/src/test/java/cn/hutool/core/date/DateTimeTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/date/DateTimeTest.java @@ -67,12 +67,12 @@ public class DateTimeTest { // 默认情况下DateTime为可变对象 DateTime offsite = dateTime.offset(DateField.YEAR, 0); - Assert.assertTrue(offsite == dateTime); + Assert.assertSame(offsite, dateTime); // 设置为不可变对象后变动将返回新对象 dateTime.setMutable(false); offsite = dateTime.offset(DateField.YEAR, 0); - Assert.assertFalse(offsite == dateTime); + Assert.assertNotSame(offsite, dateTime); } @Test @@ -86,6 +86,7 @@ public class DateTimeTest { @Test public void monthTest() { + //noinspection ConstantConditions int month = DateUtil.parse("2017-07-01").month(); Assert.assertEquals(6, month); } @@ -93,6 +94,7 @@ public class DateTimeTest { @Test public void weekOfYearTest() { DateTime date = DateUtil.parse("2016-12-27"); + //noinspection ConstantConditions Assert.assertEquals(2016, date.year()); //跨年的周返回的总是1 Assert.assertEquals(1, date.weekOfYear()); diff --git a/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java index 7ab6944e0..132a28965 100644 --- a/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/img/ImgUtilTest.java @@ -1,5 +1,10 @@ package cn.hutool.core.img; +import cn.hutool.core.io.FileUtil; +import org.junit.Ignore; +import org.junit.Test; + +import javax.imageio.ImageIO; import java.awt.Color; import java.awt.Font; import java.awt.Image; @@ -7,14 +12,6 @@ import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.IOException; -import javax.imageio.ImageIO; - -import cn.hutool.core.lang.Console; -import org.junit.Ignore; -import org.junit.Test; - -import cn.hutool.core.io.FileUtil; - public class ImgUtilTest { @Test diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/RangeTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/RangeTest.java index b9e12e5ca..6a4c73264 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/RangeTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/RangeTest.java @@ -1,12 +1,10 @@ package cn.hutool.core.lang; -import org.junit.Assert; -import org.junit.Test; - import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; -import cn.hutool.core.lang.Range; +import org.junit.Assert; +import org.junit.Test; /** * {@link Range} 单元测试 @@ -20,16 +18,11 @@ public class RangeTest { DateTime start = DateUtil.parse("2017-01-01"); DateTime end = DateUtil.parse("2017-01-02"); - final Range range = new Range(start, end, new Range.Steper(){ - - @Override - public DateTime step(DateTime current, DateTime end, int index) { - if(current.isAfterOrEquals(end)) { - return null; - } - return current.offsetNew(DateField.DAY_OF_YEAR, 1); + final Range range = new Range<>(start, end, (current, end1, index) -> { + if (current.isAfterOrEquals(end1)) { + return null; } - + return current.offsetNew(DateField.DAY_OF_YEAR, 1); }); Assert.assertTrue(range.hasNext()); @@ -41,14 +34,7 @@ public class RangeTest { @Test public void intRangeTest() { - final Range range = new Range(1, 1, new Range.Steper(){ - - @Override - public Integer step(Integer current, Integer end, int index) { - return current >= end ? null : current +10; - } - - }); + final Range range = new Range<>(1, 1, (current, end, index) -> current >= end ? null : current + 10); Assert.assertTrue(range.hasNext()); Assert.assertEquals(Integer.valueOf(1), range.next()); diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/SingletonTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/SingletonTest.java new file mode 100644 index 000000000..52c2f564b --- /dev/null +++ b/hutool-core/src/test/java/cn/hutool/core/lang/SingletonTest.java @@ -0,0 +1,30 @@ +package cn.hutool.core.lang; + +import cn.hutool.core.exceptions.UtilException; +import cn.hutool.core.thread.ThreadUtil; +import lombok.Data; +import org.junit.Test; + +public class SingletonTest { + + @Test + public void getTest(){ + // 此测试中使用1000个线程获取单例对象,其间对象只被创建一次 + ThreadUtil.concurrencyTest(1000, ()-> Singleton.get(TestBean.class)); + } + + @Data + static class TestBean{ + private static volatile TestBean testSingleton; + + public TestBean(){ + if(null != testSingleton){ + throw new UtilException("单例测试中,对象被创建了两次!"); + } + testSingleton = this; + } + + private String name; + private String age; + } +} diff --git a/hutool-core/src/test/java/cn/hutool/core/math/CombinationTest.java b/hutool-core/src/test/java/cn/hutool/core/math/CombinationTest.java index cd24b568f..7331635ba 100644 --- a/hutool-core/src/test/java/cn/hutool/core/math/CombinationTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/math/CombinationTest.java @@ -1,10 +1,10 @@ package cn.hutool.core.math; -import java.util.List; - import org.junit.Assert; import org.junit.Test; +import java.util.List; + /** * 组合单元测试 * @@ -49,6 +49,6 @@ public class CombinationTest { Assert.assertEquals(Combination.countAll(5), selectAll.size()); List list2 = combination.select(0); - Assert.assertTrue(1 == list2.size()); + Assert.assertEquals(1, list2.size()); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/swing/ClipboardMonitorTest.java b/hutool-core/src/test/java/cn/hutool/core/swing/ClipboardMonitorTest.java index 200534790..b19b1051b 100644 --- a/hutool-core/src/test/java/cn/hutool/core/swing/ClipboardMonitorTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/swing/ClipboardMonitorTest.java @@ -1,42 +1,27 @@ package cn.hutool.core.swing; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.Transferable; - +import cn.hutool.core.lang.Console; +import cn.hutool.core.swing.clipboard.ClipboardUtil; import org.junit.Ignore; import org.junit.Test; -import cn.hutool.core.lang.Console; -import cn.hutool.core.swing.clipboard.ClipboardListener; -import cn.hutool.core.swing.clipboard.ClipboardUtil; - public class ClipboardMonitorTest { @Test @Ignore public void monitorTest() { // 第一个监听 - ClipboardUtil.listen(new ClipboardListener() { - - @Override - public Transferable onChange(Clipboard clipboard, Transferable contents) { - Object object = ClipboardUtil.getStr(contents); - Console.log("1# {}", object); - return contents; - } - + ClipboardUtil.listen((clipboard, contents) -> { + Object object = ClipboardUtil.getStr(contents); + Console.log("1# {}", object); + return contents; }, false); // 第二个监听 - ClipboardUtil.listen(new ClipboardListener() { - - @Override - public Transferable onChange(Clipboard clipboard, Transferable contents) { - Object object = ClipboardUtil.getStr(contents); - Console.log("2# {}", object); - return contents; - } - + ClipboardUtil.listen((clipboard, contents) -> { + Object object = ClipboardUtil.getStr(contents); + Console.log("2# {}", object); + return contents; }); } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvParserTest.java b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvParserTest.java index bb93a6eb4..6ed052300 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvParserTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvParserTest.java @@ -1,12 +1,11 @@ package cn.hutool.core.text.csv; -import java.io.StringReader; - -import org.junit.Assert; -import org.junit.Test; - import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; +import org.junit.Assert; +import org.junit.Test; + +import java.io.StringReader; public class CsvParserTest { @@ -15,6 +14,7 @@ public class CsvParserTest { StringReader reader = StrUtil.getReader("aaa,b\"bba\",ccc"); CsvParser parser = new CsvParser(reader, null); CsvRow row = parser.nextRow(); + //noinspection ConstantConditions Assert.assertEquals("b\"bba\"", row.getRawList().get(1)); IoUtil.close(parser); } @@ -24,6 +24,7 @@ public class CsvParserTest { StringReader reader = StrUtil.getReader("aaa,\"bba\"bbb,ccc"); CsvParser parser = new CsvParser(reader, null); CsvRow row = parser.nextRow(); + //noinspection ConstantConditions Assert.assertEquals("\"bba\"bbb", row.getRawList().get(1)); IoUtil.close(parser); } @@ -33,6 +34,7 @@ public class CsvParserTest { StringReader reader = StrUtil.getReader("aaa,\"bba\",ccc"); CsvParser parser = new CsvParser(reader, null); CsvRow row = parser.nextRow(); + //noinspection ConstantConditions Assert.assertEquals("bba", row.getRawList().get(1)); IoUtil.close(parser); } @@ -42,6 +44,7 @@ public class CsvParserTest { StringReader reader = StrUtil.getReader("aaa,\"\",ccc"); CsvParser parser = new CsvParser(reader, null); CsvRow row = parser.nextRow(); + //noinspection ConstantConditions Assert.assertEquals("", row.getRawList().get(1)); IoUtil.close(parser); } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java index cf04be8fd..43eea4a40 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/csv/CsvUtilTest.java @@ -24,9 +24,7 @@ public class CsvUtilTest { @Test public void readTest2() { CsvReader reader = CsvUtil.getReader(); - reader.read(FileUtil.getUtf8Reader("test.csv"), (csvRow)->{ - Assert.notEmpty(csvRow.getRawList()); - }); + reader.read(FileUtil.getUtf8Reader("test.csv"), (csvRow)-> Assert.notEmpty(csvRow.getRawList())); } @Test diff --git a/hutool-core/src/test/java/cn/hutool/core/thread/ConcurrencyTesterTest.java b/hutool-core/src/test/java/cn/hutool/core/thread/ConcurrencyTesterTest.java index 5999b97f6..fdd4279a5 100644 --- a/hutool-core/src/test/java/cn/hutool/core/thread/ConcurrencyTesterTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/thread/ConcurrencyTesterTest.java @@ -11,14 +11,10 @@ public class ConcurrencyTesterTest { @Test @Ignore public void concurrencyTesterTest() { - ConcurrencyTester tester = ThreadUtil.concurrencyTest(100, new Runnable() { - - @Override - public void run() { - long delay = RandomUtil.randomLong(100, 1000); - ThreadUtil.sleep(delay); - Console.log("{} test finished, delay: {}", Thread.currentThread().getName(), delay); - } + ConcurrencyTester tester = ThreadUtil.concurrencyTest(100, () -> { + long delay = RandomUtil.randomLong(100, 1000); + ThreadUtil.sleep(delay); + Console.log("{} test finished, delay: {}", Thread.currentThread().getName(), delay); }); Console.log(tester.getInterval()); } diff --git a/hutool-core/src/test/java/cn/hutool/core/thread/ThreadUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/thread/ThreadUtilTest.java index ef240d436..b5483e2b0 100644 --- a/hutool-core/src/test/java/cn/hutool/core/thread/ThreadUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/thread/ThreadUtilTest.java @@ -9,13 +9,7 @@ public class ThreadUtilTest { public void executeTest() { final boolean isValid = true; - ThreadUtil.execute(new Runnable() { - - @Override - public void run() { - Assert.assertTrue(isValid); - } - }); + ThreadUtil.execute(() -> Assert.assertTrue(isValid)); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java index 018aeaa55..d32e64c7e 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/EnumUtilTest.java @@ -1,12 +1,11 @@ package cn.hutool.core.util; -import java.util.List; -import java.util.Map; - +import cn.hutool.core.collection.CollUtil; import org.junit.Assert; import org.junit.Test; -import cn.hutool.core.collection.CollUtil; +import java.util.List; +import java.util.Map; /** * EnumUtil单元测试 @@ -49,17 +48,18 @@ public class EnumUtilTest { @Test public void getNameFieldMapTest() { Map enumMap = EnumUtil.getNameFieldMap(TestEnum.class, "type"); + assert enumMap != null; Assert.assertEquals("type1", enumMap.get("TEST1")); } public enum TestEnum{ TEST1("type1"), TEST2("type2"), TEST3("type3"); - + TestEnum(String type) { this.type = type; } - - private String type; + + private final String type; private String name; public String getType() { diff --git a/hutool-core/src/test/java/cn/hutool/core/util/IdUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/IdUtilTest.java index f52adca64..99b17bef2 100644 --- a/hutool-core/src/test/java/cn/hutool/core/util/IdUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/IdUtilTest.java @@ -1,13 +1,5 @@ package cn.hutool.core.util; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.CountDownLatch; - -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; - import cn.hutool.core.collection.ConcurrentHashSet; import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.TimeInterval; @@ -15,6 +7,13 @@ import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.lang.Console; import cn.hutool.core.lang.Snowflake; import cn.hutool.core.thread.ThreadUtil; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.CountDownLatch; /** * {@link IdUtil} 单元测试 @@ -56,6 +55,7 @@ public class IdUtilTest { timer.restart(); for (int i = 0; i < 1000000; i++) { + //noinspection ResultOfMethodCallIgnored UUID.randomUUID().toString().replace("-", ""); } Console.log(timer.interval()); @@ -85,17 +85,13 @@ public class IdUtilTest { final int idCountPerThread = 10000; final CountDownLatch latch = new CountDownLatch(threadCount); for(int i =0; i < threadCount; i++) { - ThreadUtil.execute(new Runnable() { - - @Override - public void run() { - for(int i =0; i < idCountPerThread; i++) { - long id = snowflake.nextId(); - set.add(id); + ThreadUtil.execute(() -> { + for(int i1 = 0; i1 < idCountPerThread; i1++) { + long id = snowflake.nextId(); + set.add(id); // Console.log("Add new id: {}", id); - } - latch.countDown(); } + latch.countDown(); }); } @@ -118,17 +114,13 @@ public class IdUtilTest { final int idCountPerThread = 10000; final CountDownLatch latch = new CountDownLatch(threadCount); for(int i =0; i < threadCount; i++) { - ThreadUtil.execute(new Runnable() { - - @Override - public void run() { - for(int i =0; i < idCountPerThread; i++) { - long id = IdUtil.getSnowflake(1, 1).nextId(); - set.add(id); + ThreadUtil.execute(() -> { + for(int i1 = 0; i1 < idCountPerThread; i1++) { + long id = IdUtil.getSnowflake(1, 1).nextId(); + set.add(id); // Console.log("Add new id: {}", id); - } - latch.countDown(); } + latch.countDown(); }); } diff --git a/hutool-cron/src/main/java/cn/hutool/cron/CronTimer.java b/hutool-cron/src/main/java/cn/hutool/cron/CronTimer.java index c9ef127d9..81a5ea27d 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/CronTimer.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/CronTimer.java @@ -19,13 +19,13 @@ public class CronTimer extends Thread implements Serializable { private static final Log log = LogFactory.get(); /** 定时单元:秒 */ - private long TIMER_UNIT_SECOND = DateUnit.SECOND.getMillis(); + private final long TIMER_UNIT_SECOND = DateUnit.SECOND.getMillis(); /** 定时单元:分 */ - private long TIMER_UNIT_MINUTE = DateUnit.MINUTE.getMillis(); + private final long TIMER_UNIT_MINUTE = DateUnit.MINUTE.getMillis(); /** 定时任务是否已经被强制关闭 */ - private boolean isStoped; - private Scheduler scheduler; + private boolean isStop; + private final Scheduler scheduler; /** * 构造 @@ -42,7 +42,7 @@ public class CronTimer extends Thread implements Serializable { long thisTime = System.currentTimeMillis(); long nextTime; long sleep; - while(false == isStoped){ + while(false == isStop){ //下一时间计算是按照上一个执行点开始时间计算的 nextTime = ((thisTime / timerUnit) + 1) * timerUnit; sleep = nextTime - System.currentTimeMillis(); @@ -62,7 +62,7 @@ public class CronTimer extends Thread implements Serializable { * 关闭定时器 */ synchronized public void stopTimer() { - this.isStoped = true; + this.isStop = true; ThreadUtil.interrupt(this, true); } diff --git a/hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java b/hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java index a24928580..02959d57b 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/Scheduler.java @@ -55,7 +55,7 @@ import java.util.concurrent.locks.ReentrantLock; public class Scheduler implements Serializable { private static final long serialVersionUID = 1L; - private Lock lock = new ReentrantLock(); + private final Lock lock = new ReentrantLock(); /** 时区 */ private TimeZone timezone; diff --git a/hutool-cron/src/main/java/cn/hutool/cron/TaskExecutor.java b/hutool-cron/src/main/java/cn/hutool/cron/TaskExecutor.java index 0478abbe2..5365751f0 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/TaskExecutor.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/TaskExecutor.java @@ -11,8 +11,8 @@ import cn.hutool.cron.task.Task; */ public class TaskExecutor implements Runnable { - private Scheduler scheduler; - private Task task; + private final Scheduler scheduler; + private final Task task; /** * 获得任务对象 diff --git a/hutool-cron/src/main/java/cn/hutool/cron/TaskLauncher.java b/hutool-cron/src/main/java/cn/hutool/cron/TaskLauncher.java index 63c079e42..675ae8576 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/TaskLauncher.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/TaskLauncher.java @@ -10,8 +10,8 @@ package cn.hutool.cron; */ public class TaskLauncher implements Runnable{ - private Scheduler scheduler; - private long millis; + private final Scheduler scheduler; + private final long millis; public TaskLauncher(Scheduler scheduler, long millis) { this.scheduler = scheduler; diff --git a/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java b/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java index d5e4b8aef..242c6e075 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/TaskTable.java @@ -1,5 +1,8 @@ package cn.hutool.cron; +import cn.hutool.cron.pattern.CronPattern; +import cn.hutool.cron.task.Task; + import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; @@ -9,9 +12,6 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; -import cn.hutool.cron.pattern.CronPattern; -import cn.hutool.cron.task.Task; - /** * 定时任务表
* 任务表将ID、表达式、任务一一对应,定时任务执行过程中,会周期性检查定时任务表中的所有任务表达式匹配情况,从而执行其对应的任务
@@ -22,14 +22,14 @@ import cn.hutool.cron.task.Task; public class TaskTable implements Serializable { private static final long serialVersionUID = 1L; - private ReadWriteLock lock = new ReentrantReadWriteLock(); + private final ReadWriteLock lock = new ReentrantReadWriteLock(); - private Scheduler scheduler; - private TimeZone timezone; + private final Scheduler scheduler; + private final TimeZone timezone; - private List ids = new ArrayList<>(); - private List patterns = new ArrayList<>(); - private List tasks = new ArrayList<>(); + private final List ids = new ArrayList<>(); + private final List patterns = new ArrayList<>(); + private final List tasks = new ArrayList<>(); private int size; /** diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java index a0e11407b..4fe7babcf 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/CronPattern.java @@ -1,11 +1,5 @@ package cn.hutool.cron.pattern; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.GregorianCalendar; -import java.util.List; -import java.util.TimeZone; - import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.cron.CronException; @@ -22,6 +16,12 @@ import cn.hutool.cron.pattern.parser.SecondValueParser; import cn.hutool.cron.pattern.parser.ValueParser; import cn.hutool.cron.pattern.parser.YearValueParser; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.GregorianCalendar; +import java.util.List; +import java.util.TimeZone; + /** * 定时任务表达式
* 表达式类似于Linux的crontab表达式,表达式使用空格分成5个部分,按顺序依次为: @@ -90,22 +90,22 @@ public class CronPattern { private static final ValueParser DAY_OF_WEEK_VALUE_PARSER = new DayOfWeekValueParser(); private static final ValueParser YEAR_VALUE_PARSER = new YearValueParser(); - private String pattern; + private final String pattern; /** 秒字段匹配列表 */ - private List secondMatchers = new ArrayList<>(); + private final List secondMatchers = new ArrayList<>(); /** 分字段匹配列表 */ - private List minuteMatchers = new ArrayList<>(); + private final List minuteMatchers = new ArrayList<>(); /** 时字段匹配列表 */ - private List hourMatchers = new ArrayList<>(); + private final List hourMatchers = new ArrayList<>(); /** 每月几号字段匹配列表 */ - private List dayOfMonthMatchers = new ArrayList<>(); + private final List dayOfMonthMatchers = new ArrayList<>(); /** 月字段匹配列表 */ - private List monthMatchers = new ArrayList<>(); + private final List monthMatchers = new ArrayList<>(); /** 星期字段匹配列表 */ - private List dayOfWeekMatchers = new ArrayList<>(); + private final List dayOfWeekMatchers = new ArrayList<>(); /** 年字段匹配列表 */ - private List yearMatchers = new ArrayList<>(); + private final List yearMatchers = new ArrayList<>(); /** 匹配器个数,取决于复合任务表达式中的单一表达式个数 */ private int matcherSize; diff --git a/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/YearValueMatcher.java b/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/YearValueMatcher.java index a22676b88..b1bd068f2 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/YearValueMatcher.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/pattern/matcher/YearValueMatcher.java @@ -10,7 +10,7 @@ import java.util.List; */ public class YearValueMatcher implements ValueMatcher{ - private List valueList; + private final List valueList; public YearValueMatcher(List intValueList) { this.valueList = intValueList; diff --git a/hutool-cron/src/main/java/cn/hutool/cron/task/InvokeTask.java b/hutool-cron/src/main/java/cn/hutool/cron/task/InvokeTask.java index b1285c719..3993aaf82 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/task/InvokeTask.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/task/InvokeTask.java @@ -1,7 +1,5 @@ package cn.hutool.cron.task; -import java.lang.reflect.Method; - import cn.hutool.core.exceptions.UtilException; import cn.hutool.core.util.ClassLoaderUtil; import cn.hutool.core.util.ClassUtil; @@ -9,6 +7,8 @@ import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.cron.CronException; +import java.lang.reflect.Method; + /** * 反射执行任务
* 通过传入类名#方法名,通过反射执行相应的方法
@@ -19,8 +19,8 @@ import cn.hutool.cron.CronException; */ public class InvokeTask implements Task{ - private Object obj; - private Method method; + private final Object obj; + private final Method method; /** * 构造 diff --git a/hutool-cron/src/main/java/cn/hutool/cron/task/RunnableTask.java b/hutool-cron/src/main/java/cn/hutool/cron/task/RunnableTask.java index 0f4fbe046..533166b05 100644 --- a/hutool-cron/src/main/java/cn/hutool/cron/task/RunnableTask.java +++ b/hutool-cron/src/main/java/cn/hutool/cron/task/RunnableTask.java @@ -6,7 +6,7 @@ package cn.hutool.cron.task; * */ public class RunnableTask implements Task{ - private Runnable runnable; + private final Runnable runnable; public RunnableTask(Runnable runnable) { this.runnable = runnable; diff --git a/hutool-cron/src/test/java/cn/hutool/cron/demo/AddAndRemoveMainTest.java b/hutool-cron/src/test/java/cn/hutool/cron/demo/AddAndRemoveMainTest.java index a3fee6cbb..06575160f 100644 --- a/hutool-cron/src/test/java/cn/hutool/cron/demo/AddAndRemoveMainTest.java +++ b/hutool-cron/src/test/java/cn/hutool/cron/demo/AddAndRemoveMainTest.java @@ -10,23 +10,12 @@ public class AddAndRemoveMainTest { CronUtil.setMatchSecond(true); CronUtil.start(false); CronUtil.getScheduler().clear(); - String id = CronUtil.schedule("*/2 * * * * *", new Runnable() { - - @Override - public void run() { - Console.log("task running : 2s"); - } - }); + String id = CronUtil.schedule("*/2 * * * * *", (Runnable) () -> Console.log("task running : 2s")); ThreadUtil.sleep(3000); CronUtil.remove(id); Console.log("Task Removed"); - id = CronUtil.schedule("*/3 * * * * *", new Runnable() { - @Override - public void run() { - Console.log("New task add running : 3s"); - } - }); + CronUtil.schedule("*/3 * * * * *", (Runnable) () -> Console.log("New task add running : 3s")); Console.log("New Task added."); } } diff --git a/hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob.java b/hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob.java index a25fc5b43..810a52385 100644 --- a/hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob.java +++ b/hutool-cron/src/test/java/cn/hutool/cron/demo/TestJob.java @@ -13,7 +13,7 @@ import cn.hutool.core.util.IdUtil; */ public class TestJob { - private String jobId = IdUtil.simpleUUID(); + private final String jobId = IdUtil.simpleUUID(); /** * 执行定时任务内容 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/SignAlgorithm.java b/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/SignAlgorithm.java index 44f4ba037..cde306de9 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/SignAlgorithm.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/asymmetric/SignAlgorithm.java @@ -33,7 +33,7 @@ public enum SignAlgorithm { SHA384withECDSA("SHA384withECDSA"), // SHA512withECDSA("SHA512withECDSA");// - private String value; + private final String value; /** * 构造 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/BCrypt.java b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/BCrypt.java index cb86a3313..7113bb467 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/BCrypt.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/BCrypt.java @@ -1,9 +1,9 @@ package cn.hutool.crypto.digest; -import java.security.SecureRandom; - import cn.hutool.core.util.CharsetUtil; +import java.security.SecureRandom; + /** * BCrypt加密算法实现。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。 *

@@ -177,7 +177,7 @@ public class BCrypt { * @return the decoded value of x */ private static byte char64(char x) { - if ((int) x < 0 || (int) x > index_64.length) + if ((int) x > index_64.length) return -1; return index_64[(int) x]; } @@ -191,6 +191,7 @@ public class BCrypt { * @return an array containing the decoded bytes * @throws IllegalArgumentException if maxolen is invalid */ + @SuppressWarnings("SameParameterValue") private static byte[] decodeBase64(String s, int maxolen) throws IllegalArgumentException { final StringBuilder rs = new StringBuilder(); int off = 0, slen = s.length(), olen = 0; @@ -285,8 +286,8 @@ public class BCrypt { * Initialise the Blowfish key schedule */ private void init_key() { - P = (int[]) P_orig.clone(); - S = (int[]) S_orig.clone(); + P = P_orig.clone(); + S = S_orig.clone(); } /** @@ -438,7 +439,7 @@ public class BCrypt { saltb = decodeBase64(real_salt, BCRYPT_SALT_LEN); bcrypt = new BCrypt(); - hashed = bcrypt.crypt(passwordb, saltb, rounds, (int[]) bf_crypt_ciphertext.clone()); + hashed = bcrypt.crypt(passwordb, saltb, rounds, bf_crypt_ciphertext.clone()); rs.append("$2"); if (minor >= 'a') diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestAlgorithm.java b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestAlgorithm.java index 5411371b1..b3560ee00 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestAlgorithm.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/DigestAlgorithm.java @@ -14,7 +14,7 @@ public enum DigestAlgorithm { SHA384("SHA-384"), SHA512("SHA-512"); - private String value; + private final String value; /** * 构造 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HMac.java b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HMac.java index 7af08f6df..4daa0f7ab 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HMac.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HMac.java @@ -1,13 +1,5 @@ package cn.hutool.crypto.digest; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.InputStream; -import java.io.Serializable; - -import javax.crypto.SecretKey; -import javax.crypto.spec.SecretKeySpec; - import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.CharsetUtil; @@ -17,6 +9,13 @@ import cn.hutool.crypto.CryptoException; import cn.hutool.crypto.digest.mac.MacEngine; import cn.hutool.crypto.digest.mac.MacEngineFactory; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.io.Serializable; + /** * HMAC摘要算法
* HMAC,全称为“Hash Message Authentication Code”,中文名“散列消息鉴别码”
@@ -30,7 +29,7 @@ import cn.hutool.crypto.digest.mac.MacEngineFactory; public class HMac implements Serializable { private static final long serialVersionUID = 1L; - private MacEngine engine; + private final MacEngine engine; // ------------------------------------------------------------------------------------------- Constructor start /** diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HmacAlgorithm.java b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HmacAlgorithm.java index df53ebf65..08b361218 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HmacAlgorithm.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/digest/HmacAlgorithm.java @@ -15,7 +15,7 @@ public enum HmacAlgorithm { /** HmacSM3算法实现,需要BouncyCastle库支持 */ HmacSM3("HmacSM3"); - private String value; + private final String value; HmacAlgorithm(String value) { this.value = value; diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricAlgorithm.java b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricAlgorithm.java index c37f2e269..bedc93327 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricAlgorithm.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricAlgorithm.java @@ -22,7 +22,7 @@ public enum SymmetricAlgorithm { PBEWithSHA1AndDESede("PBEWithSHA1AndDESede"), PBEWithSHA1AndRC2_40("PBEWithSHA1AndRC2_40"); - private String value; + private final String value; /** * 构造 diff --git a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java index 77ec9314d..bd8fac9c1 100644 --- a/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java +++ b/hutool-crypto/src/main/java/cn/hutool/crypto/symmetric/SymmetricCrypto.java @@ -48,7 +48,7 @@ public class SymmetricCrypto implements Serializable { * 是否0填充 */ private boolean isZeroPadding; - private Lock lock = new ReentrantLock(); + private final Lock lock = new ReentrantLock(); // ------------------------------------------------------------------ Constructor start diff --git a/hutool-crypto/src/test/java/cn/hutool/crypto/test/BCUtilTest.java b/hutool-crypto/src/test/java/cn/hutool/crypto/test/BCUtilTest.java index 6afd56e99..1b9e99018 100644 --- a/hutool-crypto/src/test/java/cn/hutool/crypto/test/BCUtilTest.java +++ b/hutool-crypto/src/test/java/cn/hutool/crypto/test/BCUtilTest.java @@ -8,11 +8,6 @@ import org.junit.Test; public class BCUtilTest { - @Test - public void decodeECPointTest(){ - - } - /** * 密钥生成来自:https://i.goto327.top/CryptTools/SM2.aspx?tdsourcetag=s_pctim_aiomsg */ diff --git a/hutool-db/src/main/java/cn/hutool/db/ThreadLocalConnection.java b/hutool-db/src/main/java/cn/hutool/db/ThreadLocalConnection.java index b8af20be4..60666ee69 100644 --- a/hutool-db/src/main/java/cn/hutool/db/ThreadLocalConnection.java +++ b/hutool-db/src/main/java/cn/hutool/db/ThreadLocalConnection.java @@ -1,12 +1,11 @@ package cn.hutool.db; +import javax.sql.DataSource; import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; -import javax.sql.DataSource; - /** * 线程相关的数据库连接持有器
* 此对象为单例类,用于存储线程相关的Connection对象。
@@ -61,7 +60,7 @@ public enum ThreadLocalConnection { public static class GroupedConnection { /** 连接的Map,考虑到大部分情况是单数据库,故此处初始大小1 */ - private Map connMap = new HashMap<>(1, 1); + private final Map connMap = new HashMap<>(1, 1); /** * 获取连接,如果获取的连接为空或者已被关闭,重新创建连接 diff --git a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java index ac1711e01..05484d09a 100644 --- a/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java +++ b/hutool-db/src/main/java/cn/hutool/db/dialect/DialectFactory.java @@ -1,11 +1,5 @@ package cn.hutool.db.dialect; -import java.sql.Connection; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -import javax.sql.DataSource; - import cn.hutool.core.util.ClassLoaderUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.db.dialect.impl.AnsiSqlDialect; @@ -17,6 +11,11 @@ import cn.hutool.db.dialect.impl.SqlServer2012Dialect; import cn.hutool.db.dialect.impl.Sqlite3Dialect; import cn.hutool.log.StaticLog; +import javax.sql.DataSource; +import java.sql.Connection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + /** * 方言工厂类 * @@ -26,35 +25,35 @@ import cn.hutool.log.StaticLog; public class DialectFactory { /** JDBC 驱动 MySQL */ - public final static String DRIVER_MYSQL = "com.mysql.jdbc.Driver"; + public static final String DRIVER_MYSQL = "com.mysql.jdbc.Driver"; /** JDBC 驱动 MySQL,在6.X版本中变动驱动类名,且使用SPI机制 */ - public final static String DRIVER_MYSQL_V6 = "com.mysql.cj.jdbc.Driver"; + public static final String DRIVER_MYSQL_V6 = "com.mysql.cj.jdbc.Driver"; /** JDBC 驱动 Oracle */ - public final static String DRIVER_ORACLE = "oracle.jdbc.OracleDriver"; + public static final String DRIVER_ORACLE = "oracle.jdbc.OracleDriver"; /** JDBC 驱动 Oracle,旧版使用 */ - public final static String DRIVER_ORACLE_OLD = "oracle.jdbc.driver.OracleDriver"; + public static final String DRIVER_ORACLE_OLD = "oracle.jdbc.driver.OracleDriver"; /** JDBC 驱动 PostgreSQL */ - public final static String DRIVER_POSTGRESQL = "org.postgresql.Driver"; + public static final String DRIVER_POSTGRESQL = "org.postgresql.Driver"; /** JDBC 驱动 SQLLite3 */ - public final static String DRIVER_SQLLITE3 = "org.sqlite.JDBC"; + public static final String DRIVER_SQLLITE3 = "org.sqlite.JDBC"; /** JDBC 驱动 SQLServer */ - public final static String DRIVER_SQLSERVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + public static final String DRIVER_SQLSERVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; /** JDBC 驱动 Hive */ - public final static String DRIVER_HIVE = "org.apache.hadoop.hive.jdbc.HiveDriver"; + public static final String DRIVER_HIVE = "org.apache.hadoop.hive.jdbc.HiveDriver"; /** JDBC 驱动 Hive2 */ - public final static String DRIVER_HIVE2 = "org.apache.hive.jdbc.HiveDriver"; + public static final String DRIVER_HIVE2 = "org.apache.hive.jdbc.HiveDriver"; /** JDBC 驱动 H2 */ - public final static String DRIVER_H2 = "org.h2.Driver"; + public static final String DRIVER_H2 = "org.h2.Driver"; /** JDBC 驱动 Derby */ - public final static String DRIVER_DERBY = "org.apache.derby.jdbc.ClientDriver"; + public static final String DRIVER_DERBY = "org.apache.derby.jdbc.ClientDriver"; /** JDBC 驱动 Derby嵌入式 */ - public final static String DRIVER_DERBY_EMBEDDED = "org.apache.derby.jdbc.EmbeddedDriver"; + public static final String DRIVER_DERBY_EMBEDDED = "org.apache.derby.jdbc.EmbeddedDriver"; /** JDBC 驱动 HSQLDB */ - public final static String DRIVER_HSQLDB = "org.hsqldb.jdbc.JDBCDriver"; + public static final String DRIVER_HSQLDB = "org.hsqldb.jdbc.JDBCDriver"; /** JDBC 驱动 达梦7 */ - public final static String DRIVER_DM7 = "dm.jdbc.driver.DmDriver"; + public static final String DRIVER_DM7 = "dm.jdbc.driver.DmDriver"; - private static Map dialectPool = new ConcurrentHashMap<>(); + private static final Map DIALECT_POOL = new ConcurrentHashMap<>(); private DialectFactory() { } @@ -150,15 +149,15 @@ public class DialectFactory { * @return {@link Dialect}方言 */ public static Dialect getDialect(DataSource ds) { - Dialect dialect = dialectPool.get(ds); + Dialect dialect = DIALECT_POOL.get(ds); if(null == dialect) { // 数据源作为锁的意义在于:不同数据源不会导致阻塞,相同数据源获取方言时可保证互斥 //noinspection SynchronizationOnLocalVariableOrMethodParameter synchronized (ds) { - dialect = dialectPool.get(ds); + dialect = DIALECT_POOL.get(ds); if(null == dialect) { dialect = newDialect(ds); - dialectPool.put(ds, dialect); + DIALECT_POOL.put(ds, dialect); } } } diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/DataSourceWrapper.java b/hutool-db/src/main/java/cn/hutool/db/ds/DataSourceWrapper.java index 334e6a9c5..078c810a1 100644 --- a/hutool-db/src/main/java/cn/hutool/db/ds/DataSourceWrapper.java +++ b/hutool-db/src/main/java/cn/hutool/db/ds/DataSourceWrapper.java @@ -1,5 +1,8 @@ package cn.hutool.db.ds; +import cn.hutool.core.io.IoUtil; + +import javax.sql.DataSource; import java.io.Closeable; import java.io.PrintWriter; import java.sql.Connection; @@ -7,10 +10,6 @@ import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.logging.Logger; -import javax.sql.DataSource; - -import cn.hutool.core.io.IoUtil; - /** * {@link DataSource} 数据源实现包装,通过包装,提供基本功能外的额外功能和参数持有,包括: * @@ -23,8 +22,8 @@ import cn.hutool.core.io.IoUtil; */ public class DataSourceWrapper implements DataSource, Closeable, Cloneable { - private DataSource ds; - private String driver; + private final DataSource ds; + private final String driver; /** * 包装指定的DataSource diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbSetting.java b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbSetting.java index 09b6485b0..698bee06e 100644 --- a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbSetting.java +++ b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/DbSetting.java @@ -17,7 +17,7 @@ public class DbSetting { /** 默认的数据库连接配置文件路径 */ public final static String DEFAULT_DB_CONFIG_PATH = "config/db.setting"; - private Setting setting; + private final Setting setting; /** * 构造 diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledConnection.java b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledConnection.java index 8c9f7063a..2c72b6905 100644 --- a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledConnection.java +++ b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledConnection.java @@ -1,11 +1,11 @@ package cn.hutool.db.ds.pooled; +import cn.hutool.db.DbUtil; + import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; -import cn.hutool.db.DbUtil; - /** * 池化 * @author Looly @@ -13,7 +13,7 @@ import cn.hutool.db.DbUtil; */ public class PooledConnection extends ConnectionWraper{ - private PooledDataSource ds; + private final PooledDataSource ds; private boolean isClosed; public PooledConnection(PooledDataSource ds) throws SQLException { diff --git a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledDataSource.java b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledDataSource.java index ee0d04e08..e03f44072 100644 --- a/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledDataSource.java +++ b/hutool-db/src/main/java/cn/hutool/db/ds/pooled/PooledDataSource.java @@ -1,11 +1,5 @@ package cn.hutool.db.ds.pooled; -import java.io.IOException; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.LinkedList; -import java.util.Queue; - import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.thread.ThreadUtil; @@ -13,6 +7,11 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.db.DbRuntimeException; import cn.hutool.db.ds.simple.AbstractDataSource; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.LinkedList; +import java.util.Queue; + /** * 池化数据源 * @@ -24,7 +23,7 @@ public class PooledDataSource extends AbstractDataSource { private Queue freePool; private int activeCount; // 活跃连接数 - private DbConfig config; + private final DbConfig config; /** * 获得一个数据源 @@ -79,7 +78,7 @@ public class PooledDataSource extends AbstractDataSource { */ public PooledDataSource(DbConfig config) { this.config = config; - freePool = new LinkedList(); + freePool = new LinkedList<>(); int initialSize = config.getInitialSize(); try { while (initialSize-- > 0) { @@ -146,7 +145,7 @@ public class PooledDataSource extends AbstractDataSource { } @Override - synchronized public void close() throws IOException { + synchronized public void close() { if (CollectionUtil.isNotEmpty(this.freePool)) { for (PooledConnection pooledConnection : freePool) { pooledConnection.release(); @@ -157,7 +156,7 @@ public class PooledDataSource extends AbstractDataSource { } @Override - protected void finalize() throws Throwable { + protected void finalize() { IoUtil.close(this); } diff --git a/hutool-db/src/main/java/cn/hutool/db/handler/EntityHandler.java b/hutool-db/src/main/java/cn/hutool/db/handler/EntityHandler.java index c1a38f340..8f63880b0 100644 --- a/hutool-db/src/main/java/cn/hutool/db/handler/EntityHandler.java +++ b/hutool-db/src/main/java/cn/hutool/db/handler/EntityHandler.java @@ -1,11 +1,11 @@ package cn.hutool.db.handler; +import cn.hutool.db.Entity; + import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; -import cn.hutool.db.Entity; - /** * Entity对象处理器,只处理第一条数据 * @@ -16,7 +16,7 @@ public class EntityHandler implements RsHandler{ private static final long serialVersionUID = -8742432871908355992L; /** 是否大小写不敏感 */ - private boolean caseInsensitive; + private final boolean caseInsensitive; /** * 创建一个 EntityHandler对象 diff --git a/hutool-db/src/main/java/cn/hutool/db/handler/EntityListHandler.java b/hutool-db/src/main/java/cn/hutool/db/handler/EntityListHandler.java index b7029a76f..5501c06ca 100644 --- a/hutool-db/src/main/java/cn/hutool/db/handler/EntityListHandler.java +++ b/hutool-db/src/main/java/cn/hutool/db/handler/EntityListHandler.java @@ -1,12 +1,12 @@ package cn.hutool.db.handler; +import cn.hutool.db.Entity; + import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import cn.hutool.db.Entity; - /** * 结果集处理类 ,处理出的结果为Entity列表 * @author loolly @@ -16,7 +16,7 @@ public class EntityListHandler implements RsHandler>{ private static final long serialVersionUID = -2846240126316979895L; /** 是否大小写不敏感 */ - private boolean caseInsensitive; + private final boolean caseInsensitive; /** * 创建一个 EntityListHandler对象 diff --git a/hutool-db/src/main/java/cn/hutool/db/handler/EntitySetHandler.java b/hutool-db/src/main/java/cn/hutool/db/handler/EntitySetHandler.java index 787760b65..28e814579 100644 --- a/hutool-db/src/main/java/cn/hutool/db/handler/EntitySetHandler.java +++ b/hutool-db/src/main/java/cn/hutool/db/handler/EntitySetHandler.java @@ -1,11 +1,11 @@ package cn.hutool.db.handler; +import cn.hutool.db.Entity; + import java.sql.ResultSet; import java.sql.SQLException; import java.util.LinkedHashSet; -import cn.hutool.db.Entity; - /** * 结果集处理类 ,处理出的结果为Entity列表,结果不能重复(按照Entity对象去重) * @author loolly @@ -15,7 +15,7 @@ public class EntitySetHandler implements RsHandler>{ private static final long serialVersionUID = 8191723216703506736L; /** 是否大小写不敏感 */ - private boolean caseInsensitive; + private final boolean caseInsensitive; /** * 创建一个 EntityHandler对象 diff --git a/hutool-db/src/main/java/cn/hutool/db/handler/PageResultHandler.java b/hutool-db/src/main/java/cn/hutool/db/handler/PageResultHandler.java index d4b7d08cf..3d7c78af0 100644 --- a/hutool-db/src/main/java/cn/hutool/db/handler/PageResultHandler.java +++ b/hutool-db/src/main/java/cn/hutool/db/handler/PageResultHandler.java @@ -1,11 +1,11 @@ package cn.hutool.db.handler; -import java.sql.ResultSet; -import java.sql.SQLException; - import cn.hutool.db.Entity; import cn.hutool.db.PageResult; +import java.sql.ResultSet; +import java.sql.SQLException; + /** * 分页结果集处理类 ,处理出的结果为PageResult * @@ -14,11 +14,11 @@ import cn.hutool.db.PageResult; public class PageResultHandler implements RsHandler> { private static final long serialVersionUID = -1474161855834070108L; - private PageResult pageResult; + private final PageResult pageResult; /** * 是否大小写不敏感 */ - private boolean caseInsensitive; + private final boolean caseInsensitive; /** * 创建一个 EntityHandler对象
diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/JdbcType.java b/hutool-db/src/main/java/cn/hutool/db/meta/JdbcType.java index e980ab615..969891170 100644 --- a/hutool-db/src/main/java/cn/hutool/db/meta/JdbcType.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/JdbcType.java @@ -4,7 +4,10 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** + * JDBC中字段类型枚举 + * * @author Clinton Begin + * @see java.sql.Types */ public enum JdbcType { ARRAY(java.sql.Types.ARRAY), // @@ -60,10 +63,10 @@ public enum JdbcType { this.typeCode = code; } - private static Map codeMap = new ConcurrentHashMap<>(100, 1); + private static final Map CODE_MAP = new ConcurrentHashMap<>(100, 1); static { for (JdbcType type : JdbcType.values()) { - codeMap.put(type.typeCode, type); + CODE_MAP.put(type.typeCode, type); } } @@ -74,7 +77,7 @@ public enum JdbcType { * @return {@link JdbcType} */ public static JdbcType valueOf(int code) { - return codeMap.get(code); + return CODE_MAP.get(code); } } diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/Table.java b/hutool-db/src/main/java/cn/hutool/db/meta/Table.java index b5e5f4098..62a12f5e0 100644 --- a/hutool-db/src/main/java/cn/hutool/db/meta/Table.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/Table.java @@ -21,8 +21,8 @@ public class Table implements Serializable, Cloneable { /** 注释 */ private String comment; /** 主键字段名列表 */ - private Set pkNames = new LinkedHashSet(); - private Map columns = new LinkedHashMap<>(); + private Set pkNames = new LinkedHashSet<>(); + private final Map columns = new LinkedHashMap<>(); public static Table create(String tableName) { return new Table(tableName); diff --git a/hutool-db/src/main/java/cn/hutool/db/meta/TableType.java b/hutool-db/src/main/java/cn/hutool/db/meta/TableType.java index 84d231325..99fc289a5 100644 --- a/hutool-db/src/main/java/cn/hutool/db/meta/TableType.java +++ b/hutool-db/src/main/java/cn/hutool/db/meta/TableType.java @@ -14,7 +14,7 @@ public enum TableType { ALIAS("ALIAS"), SYNONYM("SYNONYM"); - private String value; + private final String value; /** * 构造 diff --git a/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/MongoFactory.java b/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/MongoFactory.java index b616a866f..262c64bf7 100644 --- a/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/MongoFactory.java +++ b/hutool-db/src/main/java/cn/hutool/db/nosql/mongo/MongoFactory.java @@ -1,13 +1,14 @@ package cn.hutool.db.nosql.mongo; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.RuntimeUtil; +import cn.hutool.setting.Setting; + import java.util.Collection; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.setting.Setting; - /** * MongoDB工厂类,用于创建 * @author looly @@ -19,16 +20,11 @@ public class MongoFactory { private final static String GROUP_SEPRATER = ","; /** 数据源池 */ - private static Map dsMap = new ConcurrentHashMap<>(); + private static final Map DS_MAP = new ConcurrentHashMap<>(); // JVM关闭前关闭MongoDB连接 static { - Runtime.getRuntime().addShutdownHook(new Thread() { - @Override - public void run() { - MongoFactory.closeAll(); - } - }); + RuntimeUtil.addShutdownHook(MongoFactory::closeAll); } // ------------------------------------------------------------------------ Get DS start @@ -41,11 +37,11 @@ public class MongoFactory { */ public static MongoDS getDS(String host, int port) { final String key = host + ":" + port; - MongoDS ds = dsMap.get(key); + MongoDS ds = DS_MAP.get(key); if (null == ds) { // 没有在池中加入之 ds = new MongoDS(host, port); - dsMap.put(key, ds); + DS_MAP.put(key, ds); } return ds; @@ -60,11 +56,11 @@ public class MongoFactory { */ public static MongoDS getDS(String... groups) { final String key = ArrayUtil.join(groups, GROUP_SEPRATER); - MongoDS ds = dsMap.get(key); + MongoDS ds = DS_MAP.get(key); if (null == ds) { // 没有在池中加入之 ds = new MongoDS(groups); - dsMap.put(key, ds); + DS_MAP.put(key, ds); } return ds; @@ -77,7 +73,7 @@ public class MongoFactory { * @return MongoDB连接 */ public static MongoDS getDS(Collection groups) { - return getDS(groups.toArray(new String[groups.size()])); + return getDS(groups.toArray(new String[0])); } /** @@ -89,11 +85,11 @@ public class MongoFactory { */ public static MongoDS getDS(Setting setting, String... groups) { final String key = setting.getSettingPath() + GROUP_SEPRATER + ArrayUtil.join(groups, GROUP_SEPRATER); - MongoDS ds = dsMap.get(key); + MongoDS ds = DS_MAP.get(key); if (null == ds) { // 没有在池中加入之 ds = new MongoDS(setting, groups); - dsMap.put(key, ds); + DS_MAP.put(key, ds); } return ds; @@ -107,7 +103,7 @@ public class MongoFactory { * @return MongoDB连接 */ public static MongoDS getDS(Setting setting, Collection groups) { - return getDS(setting, groups.toArray(new String[groups.size()])); + return getDS(setting, groups.toArray(new String[0])); } // ------------------------------------------------------------------------ Get DS ends @@ -115,11 +111,11 @@ public class MongoFactory { * 关闭全部连接 */ public static void closeAll() { - if(CollectionUtil.isNotEmpty(dsMap)){ - for(MongoDS ds : dsMap.values()) { + if(CollectionUtil.isNotEmpty(DS_MAP)){ + for(MongoDS ds : DS_MAP.values()) { ds.close(); } - dsMap.clear(); + DS_MAP.clear(); } } } diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java b/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java index d5471a29e..017a2113a 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/Condition.java @@ -1,37 +1,40 @@ package cn.hutool.db.sql; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - import cn.hutool.core.clone.CloneSupport; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.text.StrSpliter; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.StrUtil; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + /** * 条件对象
- * - * @author Looly * + * @author Looly */ public class Condition extends CloneSupport { /** * SQL中 LIKE 语句查询方式
- * - * @author Looly * + * @author Looly */ public enum LikeType { - /** 以给定值开头,拼接后的SQL "value%" */ + /** + * 以给定值开头,拼接后的SQL "value%" + */ StartWith, - /** 以给定值开头,拼接后的SQL "%value" */ + /** + * 以给定值开头,拼接后的SQL "%value" + */ EndWith, - /** 包含给定值,拼接后的SQL "%value%" */ + /** + * 包含给定值,拼接后的SQL "%value%" + */ Contains } @@ -44,21 +47,31 @@ public class Condition extends CloneSupport { private static final String VALUE_NULL = "NULL"; - /** 字段 */ + /** + * 字段 + */ private String field; - /** 运算符(大于号,小于号,等于号 like 等) */ + /** + * 运算符(大于号,小于号,等于号 like 等) + */ private String operator; - /** 值 */ + /** + * 值 + */ private Object value; - /** 是否使用条件值占位符 */ + /** + * 是否使用条件值占位符 + */ private boolean isPlaceHolder = true; - /** between firstValue and secondValue */ + /** + * between firstValue and secondValue + */ private Object secondValue; /** * 解析为Condition - * - * @param field 字段名 + * + * @param field 字段名 * @param expression 表达式或普通值 * @return Condition */ @@ -67,6 +80,7 @@ public class Condition extends CloneSupport { } // --------------------------------------------------------------- Constructor start + /** * 构造 */ @@ -75,7 +89,7 @@ public class Condition extends CloneSupport { /** * 构造 - * + * * @param isPlaceHolder 是否使用条件值占位符 */ public Condition(boolean isPlaceHolder) { @@ -84,7 +98,7 @@ public class Condition extends CloneSupport { /** * 构造,使用等于表达式(运算符是=) - * + * * @param field 字段 * @param value 值 */ @@ -95,10 +109,10 @@ public class Condition extends CloneSupport { /** * 构造 - * - * @param field 字段 + * + * @param field 字段 * @param operator 运算符(大于号,小于号,等于号 like 等) - * @param value 值 + * @param value 值 */ public Condition(String field, String operator, Object value) { this.field = field; @@ -108,9 +122,9 @@ public class Condition extends CloneSupport { /** * 构造 - * - * @param field 字段 - * @param value 值 + * + * @param field 字段 + * @param value 值 * @param likeType {@link LikeType} */ public Condition(String field, String value, LikeType likeType) { @@ -121,6 +135,7 @@ public class Condition extends CloneSupport { // --------------------------------------------------------------- Constructor end // --------------------------------------------------------------- Getters and Setters start + /** * @return 字段 */ @@ -130,7 +145,7 @@ public class Condition extends CloneSupport { /** * 设置字段名 - * + * * @param field 字段名 */ public void setField(String field) { @@ -140,7 +155,7 @@ public class Condition extends CloneSupport { /** * 获得运算符
* 大于号,小于号,等于号 等 - * + * * @return 运算符 */ public String getOperator() { @@ -150,7 +165,7 @@ public class Condition extends CloneSupport { /** * 设置运算符
* 大于号,小于号,等于号 等 - * + * * @param operator 运算符 */ public void setOperator(String operator) { @@ -159,7 +174,7 @@ public class Condition extends CloneSupport { /** * 获得值 - * + * * @return 值 */ public Object getValue() { @@ -168,7 +183,7 @@ public class Condition extends CloneSupport { /** * 设置值,不解析表达式 - * + * * @param value 值 */ public void setValue(Object value) { @@ -177,8 +192,8 @@ public class Condition extends CloneSupport { /** * 设置值 - * - * @param value 值 + * + * @param value 值 * @param isParse 是否解析值表达式 */ public void setValue(Object value, boolean isParse) { @@ -190,7 +205,7 @@ public class Condition extends CloneSupport { /** * 是否使用条件占位符 - * + * * @return 是否使用条件占位符 */ public boolean isPlaceHolder() { @@ -199,7 +214,7 @@ public class Condition extends CloneSupport { /** * 设置是否使用条件占位符 - * + * * @param isPlaceHolder 是否使用条件占位符 */ public void setPlaceHolder(boolean isPlaceHolder) { @@ -218,7 +233,7 @@ public class Condition extends CloneSupport { /** * 是否IN条件 - * + * * @return 是否IN条件 * @since 4.0.1 */ @@ -228,7 +243,7 @@ public class Condition extends CloneSupport { /** * 是否IS条件 - * + * * @return 是否IS条件 * @since 4.0.1 */ @@ -238,7 +253,7 @@ public class Condition extends CloneSupport { /** * 检查值是否为null,如果为null转换为 "IS NULL"形式 - * + * * @return this */ public Condition checkValueNull() { @@ -276,7 +291,7 @@ public class Condition extends CloneSupport { /** * 转换为条件字符串,并回填占位符对应的参数值 - * + * * @param paramValues 参数列表,用于回填占位符对应参数值 * @return 条件字符串 */ @@ -297,7 +312,7 @@ public class Condition extends CloneSupport { if (isPlaceHolder() && false == isOperatorIs()) { // 使用条件表达式占位符,条件表达式并不适用于 IS NULL conditionStrBuilder.append(" ?"); - if(null != paramValues) { + if (null != paramValues) { paramValues.add(this.value); } } else { @@ -310,19 +325,20 @@ public class Condition extends CloneSupport { } // ----------------------------------------------------------------------------------------------- Private method start + /** * 构建BETWEEN语句中的值部分
* 开头必须加空格,类似:" ? AND ?" 或者 " 1 AND 2" - * + * * @param conditionStrBuilder 条件语句构建器 - * @param paramValues 参数集合,用于参数占位符对应参数回填 + * @param paramValues 参数集合,用于参数占位符对应参数回填 */ private void buildValuePartForBETWEEN(StringBuilder conditionStrBuilder, List paramValues) { // BETWEEN x AND y 的情况,两个参数 if (isPlaceHolder()) { // 使用条件表达式占位符 conditionStrBuilder.append(" ?"); - if(null != paramValues) { + if (null != paramValues) { paramValues.add(this.value); } } else { @@ -335,7 +351,7 @@ public class Condition extends CloneSupport { if (isPlaceHolder()) { // 使用条件表达式占位符 conditionStrBuilder.append(" ?"); - if(null != paramValues) { + if (null != paramValues) { paramValues.add(this.secondValue); } } else { @@ -347,9 +363,9 @@ public class Condition extends CloneSupport { /** * 构建IN语句中的值部分
* 开头必须加空格,类似:" (?,?,?)" 或者 " (1,2,3,4)" - * + * * @param conditionStrBuilder 条件语句构建器 - * @param paramValues 参数集合,用于参数占位符对应参数回填 + * @param paramValues 参数集合,用于参数占位符对应参数回填 */ private void buildValuePartForIN(StringBuilder conditionStrBuilder, List paramValues) { conditionStrBuilder.append(" ("); @@ -361,12 +377,9 @@ public class Condition extends CloneSupport { valuesForIn = StrUtil.split((CharSequence) value, ','); } else { valuesForIn = Arrays.asList(Convert.convert(String[].class, value)); - if (null == valuesForIn) { - valuesForIn = CollUtil.newArrayList(Convert.toStr(value)); - } } conditionStrBuilder.append(StrUtil.repeatAndJoin("?", valuesForIn.size(), ",")); - if(null != paramValues) { + if (null != paramValues) { paramValues.addAll(valuesForIn); } } else { @@ -461,7 +474,7 @@ public class Condition extends CloneSupport { /** * 去掉包围在字符串两端的单引号或双引号 - * + * * @param value 值 * @return 去掉引号后的值 */ @@ -474,15 +487,15 @@ public class Condition extends CloneSupport { int from = 0; int to = value.length(); char startChar = value.charAt(0); - char endChar = value.charAt(to - 1); + char endChar = value.charAt(value.length() - 1); if (startChar == endChar) { if ('\'' == startChar || '"' == startChar) { from = 1; - to = to - 1; + to--; } } - if (from == 0 && to == value.length()) { + if (from == 0) { // 并不包含,返回原值 return value; } diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java b/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java index e58eea699..5899c29e5 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/NamedSql.java @@ -1,12 +1,12 @@ package cn.hutool.db.sql; +import cn.hutool.core.text.StrBuilder; +import cn.hutool.core.util.StrUtil; + import java.util.LinkedList; import java.util.List; import java.util.Map; -import cn.hutool.core.text.StrBuilder; -import cn.hutool.core.util.StrUtil; - /** * 使用命名占位符的SQL,例如:select * from table where field1=:name1
* 支持的占位符格式为: @@ -22,7 +22,7 @@ import cn.hutool.core.util.StrUtil; public class NamedSql { private String sql; - private List params; + private final List params; /** * 构造 diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/SqlFormatter.java b/hutool-db/src/main/java/cn/hutool/db/sql/SqlFormatter.java index f7e93966b..0ba99bde8 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/SqlFormatter.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/SqlFormatter.java @@ -70,8 +70,8 @@ public class SqlFormatter { boolean afterInsert = false; int inFunction = 0; int parensSinceSelect = 0; - private LinkedList parenCounts = new LinkedList<>(); - private LinkedList afterByOrFromOrSelects = new LinkedList<>(); + private final LinkedList parenCounts = new LinkedList<>(); + private final LinkedList afterByOrFromOrSelects = new LinkedList<>(); int indent = 1; @@ -273,14 +273,13 @@ public class SqlFormatter { } if (this.inFunction > 0) { this.inFunction -= 1; - out(); } else { if (!this.afterByOrSetOrFromOrSelect) { this.indent -= 1; newline(); } - out(); } + out(); this.beginLine = false; } diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/SqlUtil.java b/hutool-db/src/main/java/cn/hutool/db/sql/SqlUtil.java index 471fc182c..1a8bfa03d 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/SqlUtil.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/SqlUtil.java @@ -1,5 +1,12 @@ package cn.hutool.db.sql; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.db.DbRuntimeException; +import cn.hutool.db.Entity; +import cn.hutool.db.sql.Condition.LikeType; + import java.io.InputStream; import java.io.OutputStream; import java.io.Reader; @@ -12,13 +19,6 @@ import java.sql.SQLException; import java.util.List; import java.util.Map.Entry; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.db.DbRuntimeException; -import cn.hutool.db.Entity; -import cn.hutool.db.sql.Condition.LikeType; - /** * SQL相关工具类,包括相关SQL语句拼接等 * @@ -105,7 +105,7 @@ public class SqlUtil { */ public static String buildLikeValue(String value, LikeType likeType, boolean withLikeKeyword) { if (null == value) { - return value; + return null; } StringBuilder likeValue = StrUtil.builder(withLikeKeyword ? "LIKE " : ""); diff --git a/hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java b/hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java index 47418dfa1..525fcc5a2 100644 --- a/hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java +++ b/hutool-db/src/main/java/cn/hutool/db/sql/Wrapper.java @@ -1,15 +1,15 @@ package cn.hutool.db.sql; -import java.util.Arrays; -import java.util.Collection; -import java.util.Map.Entry; - import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Editor; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.db.Entity; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map.Entry; + /** * 包装器
* 主要用于字段名的包装(在字段名的前后加字符,例如反引号来避免与数据库的关键字冲突) @@ -135,7 +135,7 @@ public class Wrapper { return fields; } - return Arrays.asList(wrap(fields.toArray(new String[fields.size()]))); + return Arrays.asList(wrap(fields.toArray(new String[0]))); } /** diff --git a/hutool-db/src/main/java/cn/hutool/db/transaction/TransactionLevel.java b/hutool-db/src/main/java/cn/hutool/db/transaction/TransactionLevel.java index 87e655103..a80f0def8 100644 --- a/hutool-db/src/main/java/cn/hutool/db/transaction/TransactionLevel.java +++ b/hutool-db/src/main/java/cn/hutool/db/transaction/TransactionLevel.java @@ -58,7 +58,7 @@ public enum TransactionLevel { SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE); /** 事务级别,对应Connection中的常量值 */ - private int level; + private final int level; TransactionLevel(int level) { this.level = level; diff --git a/hutool-db/src/test/java/cn/hutool/db/CRUDTest.java b/hutool-db/src/test/java/cn/hutool/db/CRUDTest.java index f916f6bc8..f86c90a67 100644 --- a/hutool-db/src/test/java/cn/hutool/db/CRUDTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/CRUDTest.java @@ -22,7 +22,7 @@ import java.util.List; */ public class CRUDTest { - private static Db db = Db.use("test"); + private static final Db db = Db.use("test"); @Test public void findIsNullTest() throws SQLException { diff --git a/hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java b/hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java index b590e6117..61932406c 100644 --- a/hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/ConcurentTest.java @@ -1,16 +1,15 @@ package cn.hutool.db; -import java.sql.SQLException; -import java.util.List; - -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; - import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Console; import cn.hutool.core.thread.ThreadUtil; import cn.hutool.db.handler.EntityListHandler; +import org.junit.Before; +import org.junit.Ignore; +import org.junit.Test; + +import java.sql.SQLException; +import java.util.List; /** * SqlRunner线程安全测试 @@ -31,17 +30,14 @@ public class ConcurentTest { @Test public void findTest() { for(int i = 0; i < 10000; i++) { - ThreadUtil.execute(new Runnable() { - @Override - public void run() { - List find; - try { - find = db.find(CollectionUtil.newArrayList("name AS name2"), Entity.create("user"), new EntityListHandler()); - } catch (SQLException e) { - throw new DbRuntimeException(e); - } - Console.log(find); + ThreadUtil.execute(() -> { + List find; + try { + find = db.find(CollectionUtil.newArrayList("name AS name2"), Entity.create("user"), new EntityListHandler()); + } catch (SQLException e) { + throw new DbRuntimeException(e); } + Console.log(find); }); } diff --git a/hutool-db/src/test/java/cn/hutool/db/SessionTest.java b/hutool-db/src/test/java/cn/hutool/db/SessionTest.java index 978996edc..66b77e708 100644 --- a/hutool-db/src/test/java/cn/hutool/db/SessionTest.java +++ b/hutool-db/src/test/java/cn/hutool/db/SessionTest.java @@ -1,11 +1,9 @@ package cn.hutool.db; -import java.sql.SQLException; - import org.junit.Ignore; import org.junit.Test; -import cn.hutool.core.lang.func.VoidFunc1; +import java.sql.SQLException; /** * 事务性数据库操作单元测试 @@ -30,11 +28,6 @@ public class SessionTest { @Test @Ignore public void txTest() throws SQLException { - Session.create("test").tx(new VoidFunc1() { - @Override - public void call(Session session) throws SQLException { - session.update(Entity.create().set("age", 78), Entity.create("user").set("name", "unitTestUser")); - } - }); + Session.create("test").tx(session -> session.update(Entity.create().set("age", 78), Entity.create("user").set("name", "unitTestUser"))); } } diff --git a/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java b/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java index 8fbfa476e..c61f71b61 100644 --- a/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java +++ b/hutool-dfa/src/main/java/cn/hutool/dfa/SensitiveUtil.java @@ -16,7 +16,7 @@ public final class SensitiveUtil { // private static final Log log = LogFactory.get(); public static final char DEFAULT_SEPARATOR = StrUtil.C_COMMA; - private static WordTree sensitiveTree = new WordTree(); + private static final WordTree sensitiveTree = new WordTree(); /** * @return 是否已经被初始化 diff --git a/hutool-dfa/src/main/java/cn/hutool/dfa/WordTree.java b/hutool-dfa/src/main/java/cn/hutool/dfa/WordTree.java index 69f76e393..0d715b338 100644 --- a/hutool-dfa/src/main/java/cn/hutool/dfa/WordTree.java +++ b/hutool-dfa/src/main/java/cn/hutool/dfa/WordTree.java @@ -1,5 +1,10 @@ package cn.hutool.dfa; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.Filter; +import cn.hutool.core.text.StrBuilder; +import cn.hutool.core.util.StrUtil; + import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -7,11 +12,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.lang.Filter; -import cn.hutool.core.text.StrBuilder; -import cn.hutool.core.util.StrUtil; - /** * DFA(Deterministic Finite Automaton 确定有穷自动机) * DFA单词树(以下简称单词树),常用于在某大段文字中快速查找某几个关键词是否存在。
@@ -33,7 +33,7 @@ public class WordTree extends HashMap { /** * 敏感词字符末尾标识,用于标识单词末尾字符 */ - private Set endCharacterSet = new HashSet<>(); + private final Set endCharacterSet = new HashSet<>(); /** * 字符过滤规则,通过定义字符串过滤规则,过滤不需要的字符,当accept为false时,此字符不参与匹配 */ diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java index e0a80ae64..8290817ad 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/InternalMailUtil.java @@ -1,15 +1,15 @@ package cn.hutool.extra.mail; -import java.io.UnsupportedEncodingException; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.List; +import cn.hutool.core.util.ArrayUtil; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeUtility; - -import cn.hutool.core.util.ArrayUtil; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * 邮件内部工具类 @@ -30,15 +30,13 @@ public class InternalMailUtil { public static InternetAddress[] parseAddressFromStrs(String[] addrStrs, Charset charset) { final List resultList = new ArrayList<>(addrStrs.length); InternetAddress[] addrs; - for (int i = 0; i < addrStrs.length; i++) { - addrs = parseAddress(addrStrs[i], charset); - if(ArrayUtil.isNotEmpty(addrs)) { - for(int j = 0 ; j < addrs.length; j++) { - resultList.add(addrs[j]); - } + for (String addrStr : addrStrs) { + addrs = parseAddress(addrStr, charset); + if (ArrayUtil.isNotEmpty(addrs)) { + Collections.addAll(resultList, addrs); } } - return resultList.toArray(new InternetAddress[resultList.size()]); + return resultList.toArray(new InternetAddress[0]); } /** diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java index d3d2284a5..fa8a40b52 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java @@ -1,10 +1,11 @@ package cn.hutool.extra.mail; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.Charset; -import java.util.Date; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import javax.activation.DataHandler; import javax.activation.DataSource; @@ -19,13 +20,11 @@ import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.util.ByteArrayDataSource; - -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.Charset; +import java.util.Date; /** * 邮件发送客户端 @@ -38,7 +37,7 @@ public class Mail { /** * 邮箱帐户信息以及一些客户端配置信息 */ - private MailAccount mailAccount; + private final MailAccount mailAccount; /** * 收件人列表 */ @@ -70,7 +69,7 @@ public class Mail { /** * 正文、附件和图片的混合部分 */ - private Multipart multipart = new MimeMultipart(); + private final Multipart multipart = new MimeMultipart(); /** * 是否使用全局会话,默认为false */ diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java index c174a5e2e..8641c990d 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java @@ -467,7 +467,7 @@ public class MailAccount implements Serializable { if (this.starttlsEnable) { //STARTTLS是对纯文本通信协议的扩展。它将纯文本连接升级为加密连接(TLS或SSL), 而不是使用一个单独的加密通信端口。 - p.put(STARTTLS_ENABLE, String.valueOf(this.starttlsEnable)); + p.put(STARTTLS_ENABLE, "true"); if (null == this.sslEnable) { //为了兼容旧版本,当用户没有此项配置时,按照starttlsEnable开启状态时对待 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java index adfd5bed0..1af4c9491 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailUtil.java @@ -1,5 +1,10 @@ package cn.hutool.extra.mail; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.StrUtil; + import java.io.File; import java.io.InputStream; import java.util.Collection; @@ -7,11 +12,6 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.StrUtil; - /** * 邮件工具类,基于javax.mail封装 * @@ -370,14 +370,14 @@ public class MailUtil { // 可选抄送人 if (CollUtil.isNotEmpty(ccs)) { - mail.setCcs(ccs.toArray(new String[ccs.size()])); + mail.setCcs(ccs.toArray(new String[0])); } // 可选密送人 if (CollUtil.isNotEmpty(bccs)) { - mail.setBccs(bccs.toArray(new String[bccs.size()])); + mail.setBccs(bccs.toArray(new String[0])); } - mail.setTos(tos.toArray(new String[tos.size()])); + mail.setTos(tos.toArray(new String[0])); mail.setTitle(subject); mail.setContent(content); mail.setHtml(isHtml); diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/UserPassAuthenticator.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/UserPassAuthenticator.java index 3cd25a2fe..6e0e5a19f 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/UserPassAuthenticator.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/UserPassAuthenticator.java @@ -11,8 +11,8 @@ import javax.mail.PasswordAuthentication; */ public class UserPassAuthenticator extends Authenticator { - private String user; - private String pass; + private final String user; + private final String pass; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/BufferedImageLuminanceSource.java b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/BufferedImageLuminanceSource.java index 50f2fcad3..c11f3e847 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/qrcode/BufferedImageLuminanceSource.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/qrcode/BufferedImageLuminanceSource.java @@ -99,6 +99,7 @@ public final class BufferedImageLuminanceSource extends LuminanceSource { return true; } + @SuppressWarnings("SuspiciousNameCombination") @Override public LuminanceSource rotateCounterClockwise() { diff --git a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java index b89f65fa6..3466edff0 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/ssh/JschSessionPool.java @@ -20,7 +20,7 @@ public enum JschSessionPool { /** * SSH会话池,key:host,value:Session对象 */ - private Map sessionPool = new ConcurrentHashMap<>(); + private final Map sessionPool = new ConcurrentHashMap<>(); /** * 锁 */ diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyTemplate.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyTemplate.java index ab26ddf3d..db037f009 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyTemplate.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/enjoy/EnjoyTemplate.java @@ -1,12 +1,12 @@ package cn.hutool.extra.template.engine.enjoy; +import cn.hutool.extra.template.AbstractTemplate; + import java.io.OutputStream; import java.io.Serializable; import java.io.Writer; import java.util.Map; -import cn.hutool.extra.template.AbstractTemplate; - /** * Engoy模板实现 * @@ -16,7 +16,7 @@ import cn.hutool.extra.template.AbstractTemplate; public class EnjoyTemplate extends AbstractTemplate implements Serializable { private static final long serialVersionUID = 1L; - private com.jfinal.template.Template rawTemplate; + private final com.jfinal.template.Template rawTemplate; /** * 包装Enjoy模板 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmTemplate.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmTemplate.java index 1bab9b4ce..23505dec5 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmTemplate.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/rythm/RythmTemplate.java @@ -18,7 +18,7 @@ import java.util.Map; public class RythmTemplate extends AbstractTemplate implements Serializable { private static final long serialVersionUID = -132774960373894911L; - private org.rythmengine.template.ITemplate rawTemplate; + private final org.rythmengine.template.ITemplate rawTemplate; /** * 包装Rythm模板 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafTemplate.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafTemplate.java index a95b9e6b3..bb23ec78c 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafTemplate.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/thymeleaf/ThymeleafTemplate.java @@ -1,21 +1,20 @@ package cn.hutool.extra.template.engine.thymeleaf; -import java.io.OutputStream; -import java.io.Serializable; -import java.io.Writer; -import java.nio.charset.Charset; -import java.util.Locale; -import java.util.Map; - -import org.thymeleaf.TemplateEngine; -import org.thymeleaf.context.Context; - import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.TypeReference; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.extra.template.AbstractTemplate; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.Context; + +import java.io.OutputStream; +import java.io.Serializable; +import java.io.Writer; +import java.nio.charset.Charset; +import java.util.Locale; +import java.util.Map; /** * Thymeleaf模板实现 @@ -26,9 +25,9 @@ import cn.hutool.extra.template.AbstractTemplate; public class ThymeleafTemplate extends AbstractTemplate implements Serializable { private static final long serialVersionUID = 781284916568562509L; - private TemplateEngine engine; - private String template; - private Charset charset; + private final TemplateEngine engine; + private final String template; + private final Charset charset; /** * 包装Thymeleaf模板 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityTemplate.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityTemplate.java index 9b4d61f6d..5cee9c97c 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityTemplate.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityTemplate.java @@ -1,19 +1,18 @@ package cn.hutool.extra.template.engine.velocity; -import java.io.OutputStream; -import java.io.Serializable; -import java.io.Writer; -import java.util.Map; - -import org.apache.velocity.VelocityContext; -import org.apache.velocity.app.Velocity; - import cn.hutool.core.convert.Convert; import cn.hutool.core.io.IoUtil; import cn.hutool.core.lang.TypeReference; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.extra.template.AbstractTemplate; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; + +import java.io.OutputStream; +import java.io.Serializable; +import java.io.Writer; +import java.util.Map; /** * Velocity模板包装 @@ -24,7 +23,7 @@ import cn.hutool.extra.template.AbstractTemplate; public class VelocityTemplate extends AbstractTemplate implements Serializable { private static final long serialVersionUID = -132774960373894911L; - private org.apache.velocity.Template rawTemplate; + private final org.apache.velocity.Template rawTemplate; private String charset; /** diff --git a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityUtil.java b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityUtil.java index d8d0e75a0..6118a9670 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityUtil.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/template/engine/velocity/VelocityUtil.java @@ -37,7 +37,7 @@ public class VelocityUtil { /** * 全局上下文,当设定值时,对于每个模板都有效 */ - private static Map globalContext = new HashMap<>(); + private static final Map globalContext = new HashMap<>(); /** * 设置Velocity全局上下文
diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/hanlp/HanLPEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/hanlp/HanLPEngine.java index 1616705d9..523b01ce6 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/hanlp/HanLPEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/hanlp/HanLPEngine.java @@ -16,7 +16,7 @@ import cn.hutool.extra.tokenizer.Result; */ public class HanLPEngine implements TokenizerEngine { - private Segment seg; + private final Segment seg; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/hanlp/HanLPWord.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/hanlp/HanLPWord.java index b7060bda0..cf4408d1a 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/hanlp/HanLPWord.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/hanlp/HanLPWord.java @@ -13,7 +13,7 @@ import cn.hutool.extra.tokenizer.Word; public class HanLPWord implements Word { private static final long serialVersionUID = 1L; - private Term term; + private final Term term; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerEngine.java index 7fba710f8..ff0429e95 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerEngine.java @@ -15,7 +15,7 @@ import cn.hutool.extra.tokenizer.Result; */ public class IKAnalyzerEngine implements TokenizerEngine { - private IKSegmenter seg; + private final IKSegmenter seg; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerResult.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerResult.java index 3c102233a..2c3a2edbf 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerResult.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerResult.java @@ -1,13 +1,12 @@ package cn.hutool.extra.tokenizer.engine.ikanalyzer; -import java.io.IOException; - -import org.wltea.analyzer.core.IKSegmenter; -import org.wltea.analyzer.core.Lexeme; - import cn.hutool.extra.tokenizer.AbstractResult; import cn.hutool.extra.tokenizer.TokenizerException; import cn.hutool.extra.tokenizer.Word; +import org.wltea.analyzer.core.IKSegmenter; +import org.wltea.analyzer.core.Lexeme; + +import java.io.IOException; /** * IKAnalyzer分词结果实现
@@ -18,7 +17,7 @@ import cn.hutool.extra.tokenizer.Word; */ public class IKAnalyzerResult extends AbstractResult { - private IKSegmenter seg; + private final IKSegmenter seg; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerWord.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerWord.java index ab062f93c..e63fee809 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerWord.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/ikanalyzer/IKAnalyzerWord.java @@ -13,7 +13,7 @@ import cn.hutool.extra.tokenizer.Word; public class IKAnalyzerWord implements Word { private static final long serialVersionUID = 1L; - private Lexeme word; + private final Lexeme word; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jcseg/JcsegEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jcseg/JcsegEngine.java index 50c1b1219..98981dd1c 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jcseg/JcsegEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jcseg/JcsegEngine.java @@ -1,17 +1,16 @@ package cn.hutool.extra.tokenizer.engine.jcseg; -import java.io.IOException; -import java.io.StringReader; - +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.tokenizer.Result; +import cn.hutool.extra.tokenizer.TokenizerEngine; +import cn.hutool.extra.tokenizer.TokenizerException; import org.lionsoul.jcseg.ISegment; import org.lionsoul.jcseg.dic.ADictionary; import org.lionsoul.jcseg.dic.DictionaryFactory; import org.lionsoul.jcseg.segmenter.SegmenterConfig; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.tokenizer.TokenizerEngine; -import cn.hutool.extra.tokenizer.Result; -import cn.hutool.extra.tokenizer.TokenizerException; +import java.io.IOException; +import java.io.StringReader; /** * Jcseg分词引擎实现
@@ -22,7 +21,7 @@ import cn.hutool.extra.tokenizer.TokenizerException; */ public class JcsegEngine implements TokenizerEngine { - private ISegment segment; + private final ISegment segment; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jcseg/JcsegResult.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jcseg/JcsegResult.java index b41c7f856..a0fcd86a9 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jcseg/JcsegResult.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jcseg/JcsegResult.java @@ -19,7 +19,7 @@ import java.util.NoSuchElementException; */ public class JcsegResult implements Result{ - private ISegment result; + private final ISegment result; private Word cachedWord; /** diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jieba/JiebaEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jieba/JiebaEngine.java index 6c7897194..59afb6fed 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jieba/JiebaEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/jieba/JiebaEngine.java @@ -16,8 +16,8 @@ import cn.hutool.extra.tokenizer.Result; */ public class JiebaEngine implements TokenizerEngine { - private JiebaSegmenter jiebaSegmenter; - private SegMode mode; + private final JiebaSegmenter jiebaSegmenter; + private final SegMode mode; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mmseg/MmsegEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mmseg/MmsegEngine.java index 8f1bcd1a1..ba9736013 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mmseg/MmsegEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mmseg/MmsegEngine.java @@ -1,14 +1,13 @@ package cn.hutool.extra.tokenizer.engine.mmseg; -import java.io.StringReader; - +import cn.hutool.core.util.StrUtil; +import cn.hutool.extra.tokenizer.Result; +import cn.hutool.extra.tokenizer.TokenizerEngine; import com.chenlb.mmseg4j.ComplexSeg; import com.chenlb.mmseg4j.Dictionary; import com.chenlb.mmseg4j.MMSeg; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.tokenizer.TokenizerEngine; -import cn.hutool.extra.tokenizer.Result; +import java.io.StringReader; /** * mmseg4j分词引擎实现
@@ -19,7 +18,7 @@ import cn.hutool.extra.tokenizer.Result; */ public class MmsegEngine implements TokenizerEngine { - private MMSeg mmSeg; + private final MMSeg mmSeg; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mmseg/MmsegResult.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mmseg/MmsegResult.java index 6192ce4c8..d4e67aa3c 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mmseg/MmsegResult.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mmseg/MmsegResult.java @@ -1,12 +1,11 @@ package cn.hutool.extra.tokenizer.engine.mmseg; -import java.io.IOException; - -import com.chenlb.mmseg4j.MMSeg; - import cn.hutool.extra.tokenizer.AbstractResult; import cn.hutool.extra.tokenizer.TokenizerException; import cn.hutool.extra.tokenizer.Word; +import com.chenlb.mmseg4j.MMSeg; + +import java.io.IOException; /** * mmseg4j分词结果实现
@@ -17,7 +16,7 @@ import cn.hutool.extra.tokenizer.Word; */ public class MmsegResult extends AbstractResult { - private MMSeg mmSeg; + private final MMSeg mmSeg; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mynlp/MynlpEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mynlp/MynlpEngine.java index 640a7defc..da1ef98db 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mynlp/MynlpEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mynlp/MynlpEngine.java @@ -17,7 +17,7 @@ import cn.hutool.extra.tokenizer.TokenizerEngine; */ public class MynlpEngine implements TokenizerEngine { - private Lexer lexer; + private final Lexer lexer; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mynlp/MynlpResult.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mynlp/MynlpResult.java index 5fc0f73ea..bbef6ea36 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mynlp/MynlpResult.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/mynlp/MynlpResult.java @@ -1,12 +1,11 @@ package cn.hutool.extra.tokenizer.engine.mynlp; -import java.util.Iterator; - -import com.mayabot.nlp.segment.Sentence; -import com.mayabot.nlp.segment.WordTerm; - import cn.hutool.extra.tokenizer.Result; import cn.hutool.extra.tokenizer.Word; +import com.mayabot.nlp.segment.Sentence; +import com.mayabot.nlp.segment.WordTerm; + +import java.util.Iterator; /** * MYNLP 中文NLP工具包分词结果实现
@@ -17,7 +16,7 @@ import cn.hutool.extra.tokenizer.Word; */ public class MynlpResult implements Result { - private Iterator result; + private final Iterator result; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/word/WordEngine.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/word/WordEngine.java index 8a1823c01..dcb954fdb 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/word/WordEngine.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/word/WordEngine.java @@ -17,7 +17,7 @@ import cn.hutool.extra.tokenizer.TokenizerEngine; */ public class WordEngine implements TokenizerEngine { - private Segmentation segmentation; + private final Segmentation segmentation; /** * 构造 diff --git a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/word/WordResult.java b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/word/WordResult.java index 49f680ea0..032a4a112 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/word/WordResult.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/tokenizer/engine/word/WordResult.java @@ -1,11 +1,11 @@ package cn.hutool.extra.tokenizer.engine.word; -import java.util.Iterator; -import java.util.List; - import cn.hutool.extra.tokenizer.Result; import cn.hutool.extra.tokenizer.Word; +import java.util.Iterator; +import java.util.List; + /** * Word分词结果实现
* 项目地址:https://github.com/ysc/word @@ -15,7 +15,7 @@ import cn.hutool.extra.tokenizer.Word; */ public class WordResult implements Result{ - private Iterator wordIter; + private final Iterator wordIter; /** * 构造 diff --git a/hutool-http/src/main/java/cn/hutool/http/ContentType.java b/hutool-http/src/main/java/cn/hutool/http/ContentType.java index b7398cd39..1eb1a719b 100644 --- a/hutool-http/src/main/java/cn/hutool/http/ContentType.java +++ b/hutool-http/src/main/java/cn/hutool/http/ContentType.java @@ -41,7 +41,7 @@ public enum ContentType { */ TEXT_HTML("text/html"); - private String value; + private final String value; ContentType(String value) { this.value = value; diff --git a/hutool-http/src/main/java/cn/hutool/http/Header.java b/hutool-http/src/main/java/cn/hutool/http/Header.java index a9385d37d..1c90606c5 100644 --- a/hutool-http/src/main/java/cn/hutool/http/Header.java +++ b/hutool-http/src/main/java/cn/hutool/http/Header.java @@ -121,7 +121,7 @@ public enum Header { */ LOCATION("Location"); - private String value; + private final String value; Header(String value) { this.value = value; diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpConnection.java b/hutool-http/src/main/java/cn/hutool/http/HttpConnection.java index bd73c99b2..183bbee58 100644 --- a/hutool-http/src/main/java/cn/hutool/http/HttpConnection.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpConnection.java @@ -33,8 +33,8 @@ import java.util.Map.Entry; */ public class HttpConnection { - private URL url; - private Proxy proxy; + private final URL url; + private final Proxy proxy; private HttpURLConnection conn; /** diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpInputStream.java b/hutool-http/src/main/java/cn/hutool/http/HttpInputStream.java index 09ca2fe44..9a51a9a62 100644 --- a/hutool-http/src/main/java/cn/hutool/http/HttpInputStream.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpInputStream.java @@ -1,5 +1,7 @@ package cn.hutool.http; +import cn.hutool.core.util.StrUtil; + import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.IOException; @@ -8,8 +10,6 @@ import java.util.zip.GZIPInputStream; import java.util.zip.Inflater; import java.util.zip.InflaterInputStream; -import cn.hutool.core.util.StrUtil; - /** * HTTP输入流,此流用于包装Http请求响应内容的流,用于解析各种压缩、分段的响应流内容 * @@ -79,11 +79,10 @@ public class HttpInputStream extends InputStream { try { this.in = (response.status < HttpStatus.HTTP_BAD_REQUEST) ? response.httpConnection.getInputStream() : response.httpConnection.getErrorStream(); } catch (IOException e) { - if (e instanceof FileNotFoundException) { - // 服务器无返回内容,忽略之 - } else { + if (false == (e instanceof FileNotFoundException)) { throw new HttpException(e); } + // 服务器无返回内容,忽略之 } // 在一些情况下,返回的流为null,此时提供状态码说明 diff --git a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java index f309b8669..dea5e40d7 100644 --- a/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java +++ b/hutool-http/src/main/java/cn/hutool/http/HttpResponse.java @@ -43,7 +43,7 @@ public class HttpResponse extends HttpBase implements Closeable { /** 响应状态码 */ protected int status; /** 是否忽略读取Http响应体 */ - private boolean ignoreBody; + private final boolean ignoreBody; /** 从响应中获取的编码 */ private Charset charsetFromResponse; diff --git a/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java b/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java index 1444cdbb6..d7e8836f8 100644 --- a/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java +++ b/hutool-http/src/main/java/cn/hutool/http/server/action/RootAction.java @@ -19,7 +19,7 @@ public class RootAction implements Action { public static final String DEFAULT_INDEX_FILE_NAME = "index.html"; private final String rootDir; - private List indexFileNames; + private final List indexFileNames; /** * 构造 diff --git a/hutool-http/src/main/java/cn/hutool/http/ssl/CustomProtocolsSSLFactory.java b/hutool-http/src/main/java/cn/hutool/http/ssl/CustomProtocolsSSLFactory.java index 90ce12fb0..e1630541b 100644 --- a/hutool-http/src/main/java/cn/hutool/http/ssl/CustomProtocolsSSLFactory.java +++ b/hutool-http/src/main/java/cn/hutool/http/ssl/CustomProtocolsSSLFactory.java @@ -2,15 +2,14 @@ package cn.hutool.http.ssl; import cn.hutool.core.util.ArrayUtil; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; - /** * 自定义支持协议类型的SSLSocketFactory * @@ -18,8 +17,8 @@ import javax.net.ssl.SSLSocketFactory; */ public class CustomProtocolsSSLFactory extends SSLSocketFactory { - private String[] protocols; - private SSLSocketFactory base; + private final String[] protocols; + private final SSLSocketFactory base; /** * 构造 diff --git a/hutool-http/src/main/java/cn/hutool/http/useragent/UserAgentInfo.java b/hutool-http/src/main/java/cn/hutool/http/useragent/UserAgentInfo.java index a16ecb60f..862c2183b 100644 --- a/hutool-http/src/main/java/cn/hutool/http/useragent/UserAgentInfo.java +++ b/hutool-http/src/main/java/cn/hutool/http/useragent/UserAgentInfo.java @@ -1,9 +1,9 @@ package cn.hutool.http.useragent; -import java.util.regex.Pattern; - import cn.hutool.core.util.ReUtil; +import java.util.regex.Pattern; + /** * User-agent信息 * @@ -15,9 +15,9 @@ public class UserAgentInfo { public static final String NameUnknown = "Unknown"; /** 信息名称 */ - private String name; + private final String name; /** 信息匹配模式 */ - private Pattern pattern; + private final Pattern pattern; /** * 构造 diff --git a/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java b/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java index 5fedf4589..6c5794f49 100644 --- a/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java +++ b/hutool-http/src/main/java/cn/hutool/http/webservice/SoapClient.java @@ -1,11 +1,15 @@ package cn.hutool.http.webservice; -import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.Charset; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.map.MapUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.XmlUtil; +import cn.hutool.http.HttpGlobalConfig; +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; import javax.xml.XMLConstants; import javax.xml.namespace.QName; @@ -18,17 +22,12 @@ import javax.xml.soap.SOAPException; import javax.xml.soap.SOAPHeader; import javax.xml.soap.SOAPHeaderElement; import javax.xml.soap.SOAPMessage; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.core.util.XmlUtil; -import cn.hutool.http.HttpGlobalConfig; -import cn.hutool.http.HttpRequest; -import cn.hutool.http.HttpResponse; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.Charset; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; /** * SOAP客户端 @@ -91,7 +90,7 @@ public class SoapClient { /** * 应用于方法上的命名空间URI */ - private String namespaceURI; + private final String namespaceURI; /** * 创建SOAP客户端,默认使用soap1.1版本协议 diff --git a/hutool-http/src/main/java/cn/hutool/http/webservice/SoapProtocol.java b/hutool-http/src/main/java/cn/hutool/http/webservice/SoapProtocol.java index 22900612d..8eee3c5d4 100644 --- a/hutool-http/src/main/java/cn/hutool/http/webservice/SoapProtocol.java +++ b/hutool-http/src/main/java/cn/hutool/http/webservice/SoapProtocol.java @@ -23,7 +23,7 @@ public enum SoapProtocol { this.value = value; } - private String value; + private final String value; /** * 获取版本值信息 diff --git a/hutool-http/src/test/java/cn/hutool/http/test/DownloadTest.java b/hutool-http/src/test/java/cn/hutool/http/test/DownloadTest.java index 8cf664711..229ce0857 100644 --- a/hutool-http/src/test/java/cn/hutool/http/test/DownloadTest.java +++ b/hutool-http/src/test/java/cn/hutool/http/test/DownloadTest.java @@ -44,7 +44,7 @@ public class DownloadTest { // 带进度显示的文件下载 HttpUtil.downloadFile("http://mirrors.sohu.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso", FileUtil.file("d:/"), new StreamProgress() { - long time = System.currentTimeMillis(); + final long time = System.currentTimeMillis(); @Override public void start() { diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONNull.java b/hutool-json/src/main/java/cn/hutool/json/JSONNull.java index 2d2c4d316..7efe4ace8 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONNull.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONNull.java @@ -25,16 +25,12 @@ public class JSONNull implements Serializable{ * @param object An object to test for nullness. * @return true if the object parameter is the JSONObject.NULL object or null. */ + @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") @Override public boolean equals(Object object) { - return object == null || (object instanceof JSONNull && object == this); + return object == null || (object == this); } - @Override - public int hashCode() { - return super.hashCode(); - } - /** * Get the "null" string value. *获得“null”字符串 diff --git a/hutool-json/src/main/java/cn/hutool/json/JSONTokener.java b/hutool-json/src/main/java/cn/hutool/json/JSONTokener.java index 43ee692b1..30a940f25 100644 --- a/hutool-json/src/main/java/cn/hutool/json/JSONTokener.java +++ b/hutool-json/src/main/java/cn/hutool/json/JSONTokener.java @@ -40,7 +40,7 @@ public class JSONTokener { /** * 源 */ - private Reader reader; + private final Reader reader; /** * JSON配置 diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java index 9d5b70401..b6d0f0c51 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONArrayTest.java @@ -1,14 +1,5 @@ package cn.hutool.json; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.junit.Assert; -import org.junit.Ignore; -import org.junit.Test; - import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.lang.Console; @@ -17,6 +8,14 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.json.test.bean.Exam; import cn.hutool.json.test.bean.JsonNode; import cn.hutool.json.test.bean.KeyBean; +import org.junit.Assert; +import org.junit.Ignore; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * JSONArray单元测试 @@ -121,6 +120,7 @@ public class JSONArrayTest { String jsonStr = FileUtil.readString("exam_test.json", CharsetUtil.CHARSET_UTF_8); JSONArray array = JSONUtil.parseArray(jsonStr); + //noinspection SuspiciousToArrayCall Exam[] list = array.toArray(new Exam[0]); Assert.assertNotEquals(0, list.length); Assert.assertEquals(Exam.class, list[0].getClass()); diff --git a/hutool-json/src/test/java/cn/hutool/json/test/bean/ResultDto.java b/hutool-json/src/test/java/cn/hutool/json/test/bean/ResultDto.java index 8cc3662ae..40948f466 100644 --- a/hutool-json/src/test/java/cn/hutool/json/test/bean/ResultDto.java +++ b/hutool-json/src/test/java/cn/hutool/json/test/bean/ResultDto.java @@ -74,7 +74,7 @@ public class ResultDto implements Serializable { * @param message the message * @param result the result */ - ResultDto(int code, String message, T result) { + public ResultDto(int code, String message, T result) { super(); this.code(code).message(message).result(result); } diff --git a/hutool-log/src/main/java/cn/hutool/log/LogFactory.java b/hutool-log/src/main/java/cn/hutool/log/LogFactory.java index 01b830ecb..1730230a1 100644 --- a/hutool-log/src/main/java/cn/hutool/log/LogFactory.java +++ b/hutool-log/src/main/java/cn/hutool/log/LogFactory.java @@ -24,7 +24,7 @@ public abstract class LogFactory { /** * 日志对象缓存 */ - private Map logCache; + private final Map logCache; /** * 构造 diff --git a/hutool-log/src/main/java/cn/hutool/log/dialect/console/ConsoleLog.java b/hutool-log/src/main/java/cn/hutool/log/dialect/console/ConsoleLog.java index e8f979bbc..4de619a00 100644 --- a/hutool-log/src/main/java/cn/hutool/log/dialect/console/ConsoleLog.java +++ b/hutool-log/src/main/java/cn/hutool/log/dialect/console/ConsoleLog.java @@ -19,7 +19,7 @@ public class ConsoleLog extends AbstractLog { private static final String logFormat = "[{date}] [{level}] {name}: {msg}"; private static Level currentLevel = Level.DEBUG; - private String name; + private final String name; //------------------------------------------------------------------------- Constructor diff --git a/hutool-log/src/main/java/cn/hutool/log/dialect/slf4j/Slf4jLog.java b/hutool-log/src/main/java/cn/hutool/log/dialect/slf4j/Slf4jLog.java index 99a02b3bb..708ec2417 100644 --- a/hutool-log/src/main/java/cn/hutool/log/dialect/slf4j/Slf4jLog.java +++ b/hutool-log/src/main/java/cn/hutool/log/dialect/slf4j/Slf4jLog.java @@ -161,7 +161,6 @@ public class Slf4jLog extends AbstractLog { * @param t 异常 * @param msgTemplate 消息模板 * @param arguments 参数 - * @return 是否支持 LocationAwareLogger对象,如果不支持需要日志方法调用被包装类的相应方法 */ private void locationAwareLog(LocationAwareLogger logger, String fqcn, int level_int, Throwable t, String msgTemplate, Object[] arguments) { // ((LocationAwareLogger)this.logger).log(null, fqcn, level_int, msgTemplate, arguments, t); diff --git a/hutool-log/src/main/java/cn/hutool/log/dialect/tinylog/TinyLog.java b/hutool-log/src/main/java/cn/hutool/log/dialect/tinylog/TinyLog.java index 9c82d3a32..945527f43 100644 --- a/hutool-log/src/main/java/cn/hutool/log/dialect/tinylog/TinyLog.java +++ b/hutool-log/src/main/java/cn/hutool/log/dialect/tinylog/TinyLog.java @@ -20,8 +20,8 @@ public class TinyLog extends AbstractLog { /** 堆栈增加层数,因为封装因此多了两层,此值用于正确获取当前类名 */ private static final int DEPTH = 4; - private int level; - private String name; + private final int level; + private final String name; // ------------------------------------------------------------------------- Constructor public TinyLog(Class clazz) { diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/StyleSet.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/StyleSet.java index 9a5e08587..cf36d5480 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/StyleSet.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/StyleSet.java @@ -1,7 +1,6 @@ package cn.hutool.poi.excel; -import java.io.Serializable; - +import cn.hutool.poi.excel.style.StyleUtil; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.FillPatternType; @@ -11,7 +10,7 @@ import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.usermodel.Workbook; -import cn.hutool.poi.excel.style.StyleUtil; +import java.io.Serializable; /** * 样式集合,此样式集合汇集了整个工作簿的样式,用于减少样式的创建和冗余 @@ -23,7 +22,7 @@ public class StyleSet implements Serializable{ private static final long serialVersionUID = 1L; /** 工作簿引用 */ - private Workbook workbook; + private final Workbook workbook; /** 标题样式 */ protected CellStyle headCellStyle; /** 默认样式 */ diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java index f3d97ccd3..d8d68103b 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel03SaxReader.java @@ -45,7 +45,7 @@ public class Excel03SaxReader extends AbstractExcelSaxReader i /** * 如果为公式,true表示输出公式计算后的结果值,false表示输出公式本身 */ - private boolean isOutputFormulaValues = true; + private final boolean isOutputFormulaValues = true; /** * 用于解析公式 @@ -66,7 +66,7 @@ public class Excel03SaxReader extends AbstractExcelSaxReader i /** * Sheet边界记录,此Record中可以获得Sheet名 */ - private List boundSheetRecords = new ArrayList<>(); + private final List boundSheetRecords = new ArrayList<>(); private boolean isOutputNextStringRecord; @@ -80,7 +80,7 @@ public class Excel03SaxReader extends AbstractExcelSaxReader i // 当前表索引 private int curRid = -1; - private RowHandler rowHandler; + private final RowHandler rowHandler; /** * 构造 diff --git a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel07SaxReader.java b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel07SaxReader.java index 685841be1..a8ec63665 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel07SaxReader.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/excel/sax/Excel07SaxReader.java @@ -57,7 +57,7 @@ public class Excel07SaxReader extends AbstractExcelSaxReader i // 当前列 private int curCell; // 上一次的内容 - private StringBuilder lastContent = new StringBuilder(64); + private final StringBuilder lastContent = new StringBuilder(64); // 单元数据类型 private CellDataType cellDataType; // 当前列坐标, 如A1,B5 diff --git a/hutool-poi/src/main/java/cn/hutool/poi/word/PicType.java b/hutool-poi/src/main/java/cn/hutool/poi/word/PicType.java index 41d44c485..6ac83eee9 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/word/PicType.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/word/PicType.java @@ -28,7 +28,7 @@ public enum PicType { this.value = value; } - private int value; + private final int value; /** * 获取图片类型对应值 diff --git a/hutool-poi/src/main/java/cn/hutool/poi/word/Word07Writer.java b/hutool-poi/src/main/java/cn/hutool/poi/word/Word07Writer.java index 89492a2a2..0eadaba39 100644 --- a/hutool-poi/src/main/java/cn/hutool/poi/word/Word07Writer.java +++ b/hutool-poi/src/main/java/cn/hutool/poi/word/Word07Writer.java @@ -28,7 +28,7 @@ import java.io.OutputStream; */ public class Word07Writer implements Closeable { - private XWPFDocument doc; + private final XWPFDocument doc; /** * 目标文件 */ diff --git a/hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java b/hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java index 637fba93c..acf952944 100644 --- a/hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java +++ b/hutool-script/src/main/java/cn/hutool/script/ScriptUtil.java @@ -18,8 +18,8 @@ import javax.script.ScriptException; */ public class ScriptUtil { - private static final ScriptEngineManager manager = new ScriptEngineManager(); - private static SimpleCache cache = new SimpleCache<>(); + private static final ScriptEngineManager MANAGER = new ScriptEngineManager(); + private static final SimpleCache CACHE = new SimpleCache<>(); /** * 获得单例的{@link ScriptEngine} 实例 @@ -28,7 +28,7 @@ public class ScriptUtil { * @return {@link ScriptEngine} 实例 */ public static ScriptEngine getScript(String nameOrExtOrMime) { - return cache.get(nameOrExtOrMime, ()-> createScript(nameOrExtOrMime)); + return CACHE.get(nameOrExtOrMime, ()-> createScript(nameOrExtOrMime)); } /** @@ -39,12 +39,12 @@ public class ScriptUtil { * @since 5.2.6 */ public static ScriptEngine createScript(String nameOrExtOrMime) { - ScriptEngine engine = manager.getEngineByName(nameOrExtOrMime); + ScriptEngine engine = MANAGER.getEngineByName(nameOrExtOrMime); if (null == engine) { - engine = manager.getEngineByExtension(nameOrExtOrMime); + engine = MANAGER.getEngineByExtension(nameOrExtOrMime); } if (null == engine) { - engine = manager.getEngineByMimeType(nameOrExtOrMime); + engine = MANAGER.getEngineByMimeType(nameOrExtOrMime); } if (null == engine) { throw new NullPointerException(StrUtil.format("Script for [{}] not support !", nameOrExtOrMime)); diff --git a/hutool-setting/src/main/java/cn/hutool/setting/GroupedSet.java b/hutool-setting/src/main/java/cn/hutool/setting/GroupedSet.java index 13adfaf2e..59266129d 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/GroupedSet.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/GroupedSet.java @@ -1,5 +1,12 @@ package cn.hutool.setting; +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.CharsetUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.URLUtil; + import java.io.BufferedReader; import java.io.File; import java.io.IOException; @@ -13,13 +20,6 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.CharsetUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.core.util.URLUtil; - /** * 分组化的Set集合类
* 在配置文件中可以用中括号分隔不同的分组,每个分组会放在独立的Set中,用group区别
@@ -94,9 +94,6 @@ public class GroupedSet extends HashMap> { throw new RuntimeException("Null GroupSet file!"); } final URL url = URLUtil.getURL(configFile); - if (url == null) { - throw new RuntimeException(StrUtil.format("Can not find GroupSet file: [{}]", configFile.getAbsolutePath())); - } this.init(url, charset); } diff --git a/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java b/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java index 5a7f3eea3..542bceeaa 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/SettingLoader.java @@ -8,7 +8,6 @@ import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.log.Log; -import cn.hutool.log.LogFactory; import java.io.BufferedReader; import java.io.IOException; @@ -28,7 +27,7 @@ import java.util.Set; * */ public class SettingLoader { - private static Log log = LogFactory.get(); + private static final Log log = Log.get(); /** 注释符号(当有此符号在行首,表示此行为注释) */ private final static char COMMENT_FLAG_PRE = '#'; @@ -38,11 +37,11 @@ public class SettingLoader { private String varRegex = "\\$\\{(.*?)\\}"; /** 本设置对象的字符集 */ - private Charset charset; + private final Charset charset; /** 是否使用变量 */ - private boolean isUseVariable; + private final boolean isUseVariable; /** GroupedMap */ - private GroupedMap groupedMap; + private final GroupedMap groupedMap; /** * 构造 diff --git a/hutool-setting/src/main/java/cn/hutool/setting/SettingUtil.java b/hutool-setting/src/main/java/cn/hutool/setting/SettingUtil.java index c986f8aa1..44c7ba089 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/SettingUtil.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/SettingUtil.java @@ -17,8 +17,7 @@ public class SettingUtil { /** * 配置文件缓存 */ - private static Map settingMap = new ConcurrentHashMap<>(); - private static final Object lock = new Object(); + private static final Map SETTING_MAP = new ConcurrentHashMap<>(); /** * 获取当前环境下的配置文件
@@ -28,10 +27,10 @@ public class SettingUtil { * @return 当前环境下配置文件 */ public static Setting get(String name) { - Setting setting = settingMap.get(name); + Setting setting = SETTING_MAP.get(name); if (null == setting) { - synchronized (lock) { - setting = settingMap.get(name); + synchronized (SettingUtil.class) { + setting = SETTING_MAP.get(name); if (null == setting) { String filePath = name; String extName = FileUtil.extName(filePath); @@ -39,7 +38,7 @@ public class SettingUtil { filePath = filePath + "." + Setting.EXT_NAME; } setting = new Setting(filePath, true); - settingMap.put(name, setting); + SETTING_MAP.put(name, setting); } } } diff --git a/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java b/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java index e3f99f34b..31cfed5ec 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/dialect/PropsUtil.java @@ -19,7 +19,7 @@ public class PropsUtil { /** * 配置文件缓存 */ - private static Map propsMap = new ConcurrentHashMap<>(); + private static final Map propsMap = new ConcurrentHashMap<>(); private static final Object lock = new Object(); /** diff --git a/hutool-setting/src/main/java/cn/hutool/setting/profile/Profile.java b/hutool-setting/src/main/java/cn/hutool/setting/profile/Profile.java index 2505a26bc..a3e0c7495 100644 --- a/hutool-setting/src/main/java/cn/hutool/setting/profile/Profile.java +++ b/hutool-setting/src/main/java/cn/hutool/setting/profile/Profile.java @@ -1,14 +1,14 @@ package cn.hutool.setting.profile; +import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; +import cn.hutool.setting.Setting; + import java.io.Serializable; import java.nio.charset.Charset; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; -import cn.hutool.setting.Setting; - /** * Profile可以让我们定义一系列的配置信息,然后指定其激活条件。
* 此类中我们规范一套规则如下:
@@ -36,7 +36,7 @@ public class Profile implements Serializable { /** 是否使用变量 */ private boolean useVar; /** 配置文件缓存 */ - private Map settingMap = new ConcurrentHashMap<>(); + private final Map settingMap = new ConcurrentHashMap<>(); // -------------------------------------------------------------------------------- Constructor start /** diff --git a/hutool-setting/src/test/java/cn/hutool/setting/test/SettingUtilTest.java b/hutool-setting/src/test/java/cn/hutool/setting/test/SettingUtilTest.java index d714a7cfb..768f5fbc7 100644 --- a/hutool-setting/src/test/java/cn/hutool/setting/test/SettingUtilTest.java +++ b/hutool-setting/src/test/java/cn/hutool/setting/test/SettingUtilTest.java @@ -21,7 +21,9 @@ public class SettingUtilTest { @Test public void getFirstFoundTest() { - String driver = SettingUtil.getFirstFound("test2", "test").get("demo", "driver"); + //noinspection ConstantConditions + String driver = SettingUtil.getFirstFound("test2", "test") + .get("demo", "driver"); Assert.assertEquals("com.mysql.jdbc.Driver", driver); } } diff --git a/hutool-socket/src/main/java/cn/hutool/socket/SocketConfig.java b/hutool-socket/src/main/java/cn/hutool/socket/SocketConfig.java index 7a43611ee..6984fd519 100644 --- a/hutool-socket/src/main/java/cn/hutool/socket/SocketConfig.java +++ b/hutool-socket/src/main/java/cn/hutool/socket/SocketConfig.java @@ -1,8 +1,9 @@ package cn.hutool.socket; -import java.io.Serializable; - import cn.hutool.core.io.IoUtil; +import cn.hutool.core.util.RuntimeUtil; + +import java.io.Serializable; /** * Socket通讯配置 @@ -14,7 +15,7 @@ public class SocketConfig implements Serializable{ private static final long serialVersionUID = 1L; /** CPU核心数 */ - private static int CPU_COUNT = Runtime.getRuntime().availableProcessors(); + private static final int CPU_COUNT = RuntimeUtil.getProcessorCount(); /** 共享线程池大小,此线程池用于接收和处理用户连接 */ private int threadPoolSize = CPU_COUNT; diff --git a/hutool-socket/src/main/java/cn/hutool/socket/nio/NioServer.java b/hutool-socket/src/main/java/cn/hutool/socket/nio/NioServer.java index c5c002e3c..6ab08524e 100644 --- a/hutool-socket/src/main/java/cn/hutool/socket/nio/NioServer.java +++ b/hutool-socket/src/main/java/cn/hutool/socket/nio/NioServer.java @@ -1,5 +1,8 @@ package cn.hutool.socket.nio; +import cn.hutool.core.io.IORuntimeException; +import cn.hutool.core.io.IoUtil; + import java.io.Closeable; import java.io.IOException; import java.net.InetSocketAddress; @@ -11,9 +14,6 @@ import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; -import cn.hutool.core.io.IORuntimeException; -import cn.hutool.core.io.IoUtil; - /** * 基于NIO的Socket服务端实现 * @@ -130,7 +130,7 @@ public abstract class NioServer implements Closeable { } @Override - public void close() throws IOException { + public void close() { IoUtil.close(this.selector); IoUtil.close(this.serverSocketChannel); } @@ -166,6 +166,7 @@ public abstract class NioServer implements Closeable { try { channel.configureBlocking(false); // 注册通道 + //noinspection MagicConstant channel.register(selector, ops.getValue()); } catch (IOException e) { throw new IORuntimeException(e); diff --git a/hutool-socket/src/main/java/cn/hutool/socket/nio/Operation.java b/hutool-socket/src/main/java/cn/hutool/socket/nio/Operation.java index b3fb4a033..66d414bc6 100644 --- a/hutool-socket/src/main/java/cn/hutool/socket/nio/Operation.java +++ b/hutool-socket/src/main/java/cn/hutool/socket/nio/Operation.java @@ -18,7 +18,7 @@ public enum Operation { /** 接受连接操作 */ ACCEPT(SelectionKey.OP_ACCEPT); - private int value; + private final int value; /** * 构造 diff --git a/hutool-system/src/main/java/cn/hutool/system/HostInfo.java b/hutool-system/src/main/java/cn/hutool/system/HostInfo.java index d536251b6..6446a9161 100644 --- a/hutool-system/src/main/java/cn/hutool/system/HostInfo.java +++ b/hutool-system/src/main/java/cn/hutool/system/HostInfo.java @@ -1,10 +1,10 @@ package cn.hutool.system; +import cn.hutool.core.net.NetUtil; + import java.io.Serializable; import java.net.InetAddress; -import cn.hutool.core.net.NetUtil; - /** * 代表当前主机的信息。 */ @@ -16,8 +16,13 @@ public class HostInfo implements Serializable { public HostInfo() { final InetAddress localhost = NetUtil.getLocalhost(); - HOST_NAME = localhost.getHostName(); - HOST_ADDRESS = localhost.getHostAddress(); + if(null != localhost){ + HOST_NAME = localhost.getHostName(); + HOST_ADDRESS = localhost.getHostAddress(); + } else{ + HOST_NAME = null; + HOST_ADDRESS = null; + } } /** diff --git a/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java b/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java index 6776f672e..a74d625ab 100644 --- a/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java +++ b/hutool-system/src/main/java/cn/hutool/system/JavaInfo.java @@ -1,5 +1,6 @@ package cn.hutool.system; +import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ReUtil; import java.io.Serializable; @@ -7,7 +8,7 @@ import java.io.Serializable; /** * 代表Java Implementation的信息。 */ -public class JavaInfo implements Serializable{ +public class JavaInfo implements Serializable { private static final long serialVersionUID = 1L; private final String JAVA_VERSION = SystemUtil.get("java.version", false); @@ -32,13 +33,11 @@ public class JavaInfo implements Serializable{ /** * 取得当前Java impl.的版本(取自系统属性:java.version)。 - * + * *

* 例如Sun JDK 1.4.2:"1.4.2" - * - * + * * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回null。 - * * @since Java 1.1 */ public final String getVersion() { @@ -47,15 +46,15 @@ public class JavaInfo implements Serializable{ /** * 取得当前Java impl.的版本(取自系统属性:java.version)。 - * + * *

* 例如: - * + * *

    *
  • JDK 1.2:1.2f
  • *
  • JDK 1.3.1:1.31f
  • *
- * + * * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回0。 */ public final float getVersionFloat() { @@ -64,19 +63,17 @@ public class JavaInfo implements Serializable{ /** * 取得当前Java impl.的版本(取自系统属性:java.version),java10及其之后的版本返回值为4位。 - * + * *

* 例如: - * + * *

    *
  • JDK 1.2:120
  • *
  • JDK 1.3.1:131
  • *
  • JDK 11.0.2:1102
  • *
- * - * + * * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回0。 - * * @since Java 1.1 */ public final int getVersionInt() { @@ -85,7 +82,7 @@ public class JavaInfo implements Serializable{ /** * 取得当前Java impl.的版本的float值。 - * + * * @return Java版本的float值或0 */ private float getJavaVersionAsFloat() { @@ -95,14 +92,14 @@ public class JavaInfo implements Serializable{ String str = JAVA_VERSION; - str = ReUtil.get("^[0-9]{1,2}(\\.[0-9]{1,2})?", str,0); + str = ReUtil.get("^[0-9]{1,2}(\\.[0-9]{1,2})?", str, 0); - return Float.parseFloat(str); + return Float.parseFloat(str); } /** * 取得当前Java impl.的版本的int值。 - * + * * @return Java版本的int值或0 */ private int getJavaVersionAsInt() { @@ -110,22 +107,14 @@ public class JavaInfo implements Serializable{ return 0; } - String java_version = JAVA_VERSION; + String javaVersion = ReUtil.get("^[0-9]{1,2}(\\.[0-9]{1,2}){0,2}", JAVA_VERSION, 0); - java_version = ReUtil.get("^[0-9]{1,2}(\\.[0-9]{1,2}){0,2}", java_version,0); + String[] split = javaVersion.split("\\."); + String result = ArrayUtil.join(split, ""); - String[] split = java_version.split("\\."); - - String result = ""; - - for (int i = 0; i < split.length; i++) { - result = result + split[i]; - } - - //保证java10及其之后的版本返回的值为4位 - if (split[0].length()>1 && result.length()!=4){ - result = result + "0000"; - result = result.substring(0,4); + //保证java10及其之后的版本返回的值为4位 + if (split[0].length() > 1) { + result = (result + "0000").substring(0, 4); } return Integer.parseInt(result); @@ -133,13 +122,11 @@ public class JavaInfo implements Serializable{ /** * 取得当前Java impl.的厂商(取自系统属性:java.vendor)。 - * + * *

* 例如Sun JDK 1.4.2:"Sun Microsystems Inc." - * - * + * * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回null。 - * * @since Java 1.1 */ public final String getVendor() { @@ -148,13 +135,11 @@ public class JavaInfo implements Serializable{ /** * 取得当前Java impl.的厂商网站的URL(取自系统属性:java.vendor.url)。 - * + * *

* 例如Sun JDK 1.4.2:"http://java.sun.com/" - * - * + * * @return 属性值,如果不能取得(因为Java安全限制)或值不存在,则返回null。 - * * @since Java 1.1 */ public final String getVendorURL() { @@ -163,11 +148,10 @@ public class JavaInfo implements Serializable{ /** * 判断当前Java的版本。 - * + * *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false - * - * + * * @return 如果当前Java版本为1.1,则返回true */ public final boolean isJava1_1() { @@ -176,11 +160,10 @@ public class JavaInfo implements Serializable{ /** * 判断当前Java的版本。 - * + * *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false - * - * + * * @return 如果当前Java版本为1.2,则返回true */ public final boolean isJava1_2() { @@ -189,11 +172,10 @@ public class JavaInfo implements Serializable{ /** * 判断当前Java的版本。 - * + * *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false - * - * + * * @return 如果当前Java版本为1.3,则返回true */ public final boolean isJava1_3() { @@ -202,11 +184,10 @@ public class JavaInfo implements Serializable{ /** * 判断当前Java的版本。 - * + * *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false - * - * + * * @return 如果当前Java版本为1.4,则返回true */ public final boolean isJava1_4() { @@ -215,11 +196,10 @@ public class JavaInfo implements Serializable{ /** * 判断当前Java的版本。 - * + * *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false - * - * + * * @return 如果当前Java版本为1.5,则返回true */ public final boolean isJava1_5() { @@ -228,11 +208,10 @@ public class JavaInfo implements Serializable{ /** * 判断当前Java的版本。 - * + * *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false - * - * + * * @return 如果当前Java版本为1.6,则返回true */ public final boolean isJava1_6() { @@ -241,11 +220,10 @@ public class JavaInfo implements Serializable{ /** * 判断当前Java的版本。 - * + * *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false - * - * + * * @return 如果当前Java版本为1.7,则返回true */ public final boolean isJava1_7() { @@ -257,7 +235,6 @@ public class JavaInfo implements Serializable{ * *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false - * * * @return 如果当前Java版本为1.8,则返回true */ @@ -271,7 +248,6 @@ public class JavaInfo implements Serializable{ *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false * - * * @return 如果当前Java版本为9,则返回true */ public final boolean isJava9() { @@ -284,7 +260,6 @@ public class JavaInfo implements Serializable{ *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false * - * * @return 如果当前Java版本为10,则返回true */ public final boolean isJava10() { @@ -297,7 +272,6 @@ public class JavaInfo implements Serializable{ *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false * - * * @return 如果当前Java版本为11,则返回true */ public final boolean isJava11() { @@ -310,7 +284,6 @@ public class JavaInfo implements Serializable{ *

* 如果不能取得系统属性java.version(因为Java安全限制),则总是返回 false * - * * @return 如果当前Java版本为12,则返回true */ public final boolean isJava12() { @@ -319,9 +292,8 @@ public class JavaInfo implements Serializable{ /** * 匹配当前Java的版本。 - * + * * @param versionPrefix Java版本前缀 - * * @return 如果版本匹配,则返回true */ private boolean getJavaVersionMatches(String versionPrefix) { @@ -334,19 +306,17 @@ public class JavaInfo implements Serializable{ /** * 判定当前Java的版本是否大于等于指定的版本号。 - * + * *

* 例如: - * - * + * + * *

    *
  • 测试JDK 1.2:isJavaVersionAtLeast(1.2f)
  • *
  • 测试JDK 1.2.1:isJavaVersionAtLeast(1.31f)
  • *
- * - * + * * @param requiredVersion 需要的版本 - * * @return 如果当前Java版本大于或等于指定的版本,则返回true */ public final boolean isJavaVersionAtLeast(float requiredVersion) { @@ -355,19 +325,17 @@ public class JavaInfo implements Serializable{ /** * 判定当前Java的版本是否大于等于指定的版本号。 - * + * *

* 例如: - * - * + * + * *

    *
  • 测试JDK 1.2:isJavaVersionAtLeast(120)
  • *
  • 测试JDK 1.2.1:isJavaVersionAtLeast(131)
  • *
- * - * + * * @param requiredVersion 需要的版本 - * * @return 如果当前Java版本大于或等于指定的版本,则返回true */ public final boolean isJavaVersionAtLeast(int requiredVersion) { @@ -376,7 +344,7 @@ public class JavaInfo implements Serializable{ /** * 将Java Implementation的信息转换成字符串。 - * + * * @return JVM impl.的字符串表示 */ @Override diff --git a/hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java b/hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java index ef6b380a3..328992fbc 100644 --- a/hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java +++ b/hutool-system/src/main/java/cn/hutool/system/RuntimeInfo.java @@ -1,59 +1,64 @@ package cn.hutool.system; -import java.io.Serializable; - import cn.hutool.core.io.FileUtil; +import java.io.Serializable; + /** * 运行时信息,包括内存总大小、已用大小、可用大小等 - * @author looly * + * @author looly */ -public class RuntimeInfo implements Serializable{ +public class RuntimeInfo implements Serializable { private static final long serialVersionUID = 1L; - - private Runtime currentRuntime = Runtime.getRuntime(); - + + private final Runtime currentRuntime = Runtime.getRuntime(); + /** * 获得运行时对象 + * * @return {@link Runtime} */ - public final Runtime getRuntime(){ + public final Runtime getRuntime() { return currentRuntime; } - + /** * 获得JVM最大内存 + * * @return 最大内存 */ - public final long getMaxMemory(){ + public final long getMaxMemory() { return currentRuntime.maxMemory(); } - + /** * 获得JVM已分配内存 + * * @return 已分配内存 */ - public final long getTotalMemory(){ + public final long getTotalMemory() { return currentRuntime.totalMemory(); } - + /** * 获得JVM已分配内存中的剩余空间 + * * @return 已分配内存中的剩余空间 */ - public final long getFreeMemory(){ + public final long getFreeMemory() { return currentRuntime.freeMemory(); } - + /** * 获得JVM最大可用内存 + * * @return 最大可用内存 */ - public final long getUsableMemory(){ + public final long getUsableMemory() { return currentRuntime.maxMemory() - currentRuntime.totalMemory() + currentRuntime.freeMemory(); } - + @Override public String toString() { StringBuilder builder = new StringBuilder();