com.palantir.baseline:baseline-error-prone の検査の一覧和訳 part 2/2
part 1の続きです。
和訳しておきます。
com/palantir/baseline/errorprone/ImplicitPublicBuilderConstructor
カプセル化クラス(?)のstatic factory methodを持つビルダーは、private コンストラクタを持つべきです。 不必要なpublic APIを小さくすることで、将来のAPIの変更から利用者への影響を防ぎます。
com/palantir/baseline/errorprone/IncubatingMethod
可能であれば、incubatingのメソッドを使うのは避けるべきです、それらはとても弱い安定性の保証なので。 ケースバイケースで、このチェックを明示的に無効化することができます。
com/palantir/baseline/errorprone/InvocationHandlerDelegation
他のオブジェクトに移譲されているInvocationHandlersは、InvocationTargetException
を catchして、unwrapするべきです。
そうしなければ、移譲先が例外をthrowするたびに UndeclaredThrowableException
をthrowされます。
このチェックは助言を意図しており、特定のケースでは抑制してもよいですが、通常はおすすめされません。
com/palantir/baseline/errorprone/InvocationTargetExceptionGetTargetException
InvocationTargetException.getTargetException()
は一般的な用途の例外の連鎖機能よりも前から存在します。
現在この情報を取得するには Throwable.getCause()
メソッドが推奨される手段です。
ソース: https://docs.oracle.com/en/java/javase/17/docs/api//java.base/java/lang/reflect/InvocationTargetException.html#getTargetException()
com/palantir/baseline/errorprone/JUnit5RuleUsage
JUnit5 のテストで、Rule/ClassRules を使っても、静かに実行されません。
com/palantir/baseline/errorprone/JUnit5SuiteMisuse
JUnit4のスイートからJUnit5のテストを参照しても、静かに動きません。
com/palantir/baseline/errorprone/JavaTimeSystemDefaultTimeZone
システム依存の挙動のため、システムのデフォルトのタイムゾーンは使うべきではありません。 代わりに UTCを必ず使うべきです。
com/palantir/baseline/errorprone/JooqBatchWithoutBindArgs
jOOQのバッチメソッドで引数の束縛をしない実行は、パフォーマンスの問題を引き起こす可能性があります。
com/palantir/baseline/errorprone/JooqResultStreamLeak
jOOQのResultQueryにおいて、autocloseableなリソースを返却するメソッドは、try-with-resourcesでcloseされるべきです。 そうしなければ、データーベースのリソースリークを引き起こし、例外がスローされたり、closeの呼び出しに失敗する可能性があります。
com/palantir/baseline/errorprone/LambdaMethodReference
このラムダは、メソッド参照であるべきです。
com/palantir/baseline/errorprone/LogSafePreconditionsMessageFormat
訳者注:
palantirで使われているsafe-loggingの話っぽいので飛ばす。
com/palantir/baseline/errorprone/LoggerEnclosingClass
getLogger(Class<?>)
を使って作られたLoggerは、それを囲うクラスで参照するべきです。
訳者注:
com/palantir/baseline/errorprone/LoggerInterpolationConsumesThrowable
意訳: ロガーのinterpolationにthrowableが指定されている。
com/palantir/baseline/errorprone/LoggingDoNotLog
訳者注:
palantirで使われているsafe-loggingの話っぽいので飛ばす。
com/palantir/baseline/errorprone/LogsafeArgName
訳者注:
palantirで使われているsafe-loggingの話っぽいので飛ばす。
com/palantir/baseline/errorprone/LogsafeThrowableArgument
訳者注:
palantirで使われているsafe-loggingの話っぽいので飛ばす。
com/palantir/baseline/errorprone/NonComparableStreamSort
Stream.sorted()
は Comparableな型のStreamでのみ呼び出しされるべきです。
com/palantir/baseline/errorprone/ObjectsHashCodeUnnecessaryVarargs
可変長配列のアロケーションを避けるために Objects.hash(non-varargs)
は java.util.Objects.hashCode(value)
で置き換えられるべきです。
com/palantir/baseline/errorprone/OptionalFlatMapOfNullable
Optional.map
は 安全に空の結果を生成するために、nullを返す場合があります。
com/palantir/baseline/errorprone/OptionalOrElseGetValue
Optional#orElseGet
に渡されたラムダ式が simple expressionなら、代わりに Optional#orElse
を使ってください。
com/palantir/baseline/errorprone/OptionalOrElseMethodInvocation
Optional#orElse
に渡された式がメソッドを呼び出しているなら、代わりに Optional#orElseGet
を使ってください。
com/palantir/baseline/errorprone/OptionalOrElseThrowThrows
Optional#orElseThrow
の引数はexceptionを返すべきです。throwするのではありません。
com/palantir/baseline/errorprone/PreconditionsConstantMessage
Preconditions.checkX()
では、定数のメッセージのみ許可されています。
訳者注:
Preconditionsはguavaのクラス
com/palantir/baseline/errorprone/PreferBuiltInConcurrentKeySet
Guava の ConcurrentHashSetよりも、Javaの組み込みのConcurrent Setを好みます。 これは間接的な処理(?)を減らしてGuavaに依存しないためです。
com/palantir/baseline/errorprone/PreferCollectionConstructors
Guavaのstatic factory methodよりも、Java 7以降では、標準コレクションコンストラクタを使うべきです。
com/palantir/baseline/errorprone/PreferCollectionTransform
訳者注:
訳者は、Guava使わないので、飛ばす。読むの疲れてきた。
com/palantir/baseline/errorprone/PreferCommonAnnotations
コピーよりも、commonのアノテーションを使います。
訳者注:
guavaに入っているアノテーションのこと。
com/palantir/baseline/errorprone/PreferImmutableStreamExCollections
訳者注:
streamexの話なので飛ばす。
com/palantir/baseline/errorprone/PreferInputStreamTransferTo
ライブラリのutilityメソッドより、JDKの InputStream.transferTo(OutputStream)
を好みます。
(ex. com.google.common.io.ByteStreams.copy(InputStream, OutputStream)
, org.apache.commons.io.IOUtils.copy(InputStream, OutputStream)
, org.apache.commons.io.IOUtils.copyLong(InputStream, OutputStream)
)
参考: https://github.com/palantir/gradle-baseline/issues/2615
com/palantir/baseline/errorprone/PreferListsPartition
訳者注:
訳者は、Guava使わないので、飛ばす。
com/palantir/baseline/errorprone/PreferSafeLoggableExceptions
訳者注:
palantirで使われているsafe-loggingの話っぽいので飛ばす。
com/palantir/baseline/errorprone/PreferSafeLogger
訳者注:
palantirで使われているsafe-loggingの話っぽいので飛ばす。
com/palantir/baseline/errorprone/PreferSafeLoggingPreconditions
訳者注:
palantirで使われているsafe-loggingの話っぽいので飛ばす。
com/palantir/baseline/errorprone/PreferStaticLoggers
訳者注:
palantirで使われているsafe-loggingの話っぽいので飛ばす。
com/palantir/baseline/errorprone/PreventTokenLogging
訳者注:
palantirで使われている認証トークンの型をログ出力していると怒られるルール
com/palantir/baseline/errorprone/ProxyNonConstantType
Proxyインスタンスは、native-imageの動作がhotspotと一致するように、コンパイル時に既知の定数の型を使って作られるべきです。
任意のクラスインスタンスの代わりに、proxyをビルドするメソッドは、Function<InvocationHandler, ? extends T>
関数を受け取るべきです。
このチェックは、SuppressWarningsを使って、レガシーコードの中では安全に抑制することが可能です。
proxy annotation processor はこの処理をより簡単にします。ref: https://github.com/palantir/proxy-processor
参照: https://www.graalvm.org/reference-manual/native-image/DynamicProxy/#automatic-detection
com/palantir/baseline/errorprone/RawTypes
Rawタイプを避けてください。可能であれば、実際の型パラメータを追加してください。 これは 必要に応じて、SuppressWarningsで 抑制が可能です, より古いライブラリのコードとやりとりする時など。
com/palantir/baseline/errorprone/ReadReturnValueIgnored
readの呼び出しの結果は、EOFに到達したか、期待している消費するバイトの数かどうかをチェックすべきです。
com/palantir/baseline/errorprone/RedundantMethodReference
同じ型への冗長なメソッド参照
com/palantir/baseline/errorprone/RedundantModifier
冗長な modifierを使うことを避ける
com/palantir/baseline/errorprone/ReverseDnsLookup
address.getHostName
を呼び出すと、ネットワーク呼び出しであるDNSの逆引きにつながる可能性があり、その呼出しは、環境によっては、期待しているよりも大幅に高価です。このチェックは、助言を意図しています。特定のケースでは、抑制しても良いですが、通常おすすめできません。
com/palantir/baseline/errorprone/SafeLoggingExceptionMessageFormat
訳者注:
palantirで使われているsafe-loggingの話っぽいので飛ばす。
com/palantir/baseline/errorprone/SafeLoggingPropagation
訳者注:
palantirで使われているsafe-loggingの話っぽいので飛ばす。
com/palantir/baseline/errorprone/ShutdownHook
Runtime#addShutdownHook
を直接使うのではなく、webserverの管理リソースの機能を使うべきです。
com/palantir/baseline/errorprone/Slf4jConstantLogMessage
slf4jのログメッセージは、コンパイル時定数のみ許可されています。
com/palantir/baseline/errorprone/Slf4jLevelCheck
slf4jの log.is[Level]Enabled
は最も厳しいログ文に一致するべきです。
com/palantir/baseline/errorprone/Slf4jLogsafeArgs
訳者注:
palantirで使われているsafe-loggingの話っぽいので飛ばす。
com/palantir/baseline/errorprone/Slf4jThrowable
slf4jのロガーは、throwableを最後のパラメータに要求します。さもなければ、スタックトレースは生成されません。 ドキュメントはこちらです。 http://www.slf4j.org/faq.html#paramException
com/palantir/baseline/errorprone/SortedStreamFirstElement
Stream::min は 一番小さい要素を探すために、線形探索を実行します。
com/palantir/baseline/errorprone/StreamOfEmpty
不必要な可変長配列のアロケーションを避けるために Stream.of()
(実引数なし) は Stream.emptyで置き換えられるべきです。
com/palantir/baseline/errorprone/StrictCollectionIncompatibleType
Objectを受け取るコレクションのメソッドに引数として適合しない型を使っているため、プログラムエラーに見受けられる。
com/palantir/baseline/errorprone/StrictUnusedVariable
使っていない。
com/palantir/baseline/errorprone/StringBuilderConstantParameters
決まった数の引数でStringBuilderを使うことは、単純な結合に置き換えられるべきです。
com/palantir/baseline/errorprone/ThrowError
Error
よりも、RuntimeException
を投げることを好んでください。エラーはしばしばライブラリによって処理されず、結果として予期しない挙動やリソースリークに繋がります。
cathc(Exception e)
は Errorをキャッチしないことは明確ではありません。エラーは、通常JVMによって投げられ、システムが、単にアプリケーションではなく、良くない状態になっているときです。例えば、適合しない型に遭遇したとき、LinkageError
はJVMによって投げられ、また NoClassDefFoundError
は、クラスが見つからなかった時に投げられます。これらは、一般的ではなく、アプリケーションの失敗とは異なる処理するべきです。このチェックは助言を意図しています。
特定のケースでは、抑制することは問題ありませんが、通常はおすすめされません。あなたがAssertionErrorを投げるテストライブラリを書いてないなら。
com/palantir/baseline/errorprone/ThrowSpecificity
ExceptionやThrowableではなく、もっとより具体的なthrowする型を定義することを好みます。 新しいチェック例外をthrowするためにメソッドを更新したときに、呼び出し元は失敗した型を明示的に処理することを期待するいます。 広い型をthrowすることは、型システムが無効になります。可能な限り、より具体的な型をthrowすることで、既存のコンパイラの機能を活用して到達しないコードを検査します。 Note: チェック例外は、コンパイラによってのみ検査され、実行時に非標準のバイトコードによって投げられる可能性があります。例えば、JavaからgroovyやScalaが生成したバイトコードを呼び出した時、チェック例外は宣言に内にも関わらず、投げられることがあります。このシナリオのために、私達はこの検査を抑制し、理由を記載したコメントすることをおすすめします。残りのインスタンスは error-proneのsuggested fixで自動的に修正が可能です。
com/palantir/baseline/errorprone/TooManyArguments
たくさんよりも少数の引数を取るインターフェースが好ましい。
com/palantir/baseline/errorprone/UnnecessarilyQualified
importされているのであれば、正規型にすべきではない。
com/palantir/baseline/errorprone/UnnecessaryLambdaArgumentParentheses
単一引数のラムダは、カッコは必要ありません。
com/palantir/baseline/errorprone/UnsafeGaugeRegistration
TaggedMetricRegistry.gaugeを使うことは、map.putIfAbsentと等価です。そして、分かりづらいリソースリークを引き起こす可能性があります。 既存のgaugeの値を置き換えることが好ましい。これは、自動で修正が可能です。
com/palantir/baseline/errorprone/ValidateConstantMessage
Validate.X() のメソッドは定数メッセージのみ許可されています。
訳者注:
org.apache.commons.lang3.Validate のメソッドの話。
com/palantir/baseline/errorprone/VarUsage
var
キーワードは、多くのケースで判読不能になり、使うべきではありません。
com/palantir/baseline/errorprone/VisibleForTestingPackagePrivate
VisibleForTestingのメンバーは、package-privateの可視性であるべきです。
com/palantir/baseline/errorprone/ZeroWarmupRateLimiter
zero warmup durationの RateLimitersは rate limitしません。 https://github.com/google/guava/issues/2730 でトラックされています。
訳者注:
guavaの話らしい。
com/palantir/baseline/errorprone/ZoneIdConstant
ZoneIdの定数を好みます。
終わり
com.palantir.baseline:baseline-error-proneのルールを一通り和訳してみました。 大体の検査は一般的に便利そうな検査が多い感じですね。
一方で、guavaやその他の使わなさそうなライブラリのチェックなども入っているようです。 必要に応じて無効化したいですね。
終わり。