com.palantir.baseline:baseline-error-prone の検査の一覧和訳 part 2/2

part 1の続きです。

progret.hatenadiary.com

和訳しておきます。

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は、それを囲うクラスで参照するべきです。

訳者注:

テストコード見たほうが早い。 https://github.com/palantir/gradle-baseline/blob/5e773859eee2463ca8b262f8730efff13cdb32db/baseline-error-prone/src/test/java/com/palantir/baseline/errorprone/LoggerEnclosingClassTest.java

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メソッドより、JDKInputStream.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によって投げられ、システムが、単にアプリケーションではなく、良くない状態になっているときです。例えば、適合しない型に遭遇したとき、LinkageErrorJVMによって投げられ、また 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やその他の使わなさそうなライブラリのチェックなども入っているようです。 必要に応じて無効化したいですね。

終わり。

gradle向け error-proneでsuggestedFixを適用する方法

以下のプラグインを使っている前提で書きます。

github.com

こうです。

tasks.withType(JavaCompile).configureEach {
    options.errorprone {
        // error-proneのsuggested fixesを適用する
        // usage: ./gradlew compileJava compileTestJava -PerrorProneApply
        if (project.hasProperty("errorProneApply")) {
            errorproneArgs.addAll("-XepPatchLocation:IN_PLACE")
        }
    }
}

終わり。調べても出てこんので、メモ程度に書いておいた。

com.palantir.baseline:baseline-error-prone の検査の一覧和訳 part 1/2

com.palantir.baseline:baseline-error-proneの検査のsummaryを和訳していきます。 part 1です。途中で力尽きたので、とりあえずここまでで上げておきます。

com/palantir/baseline/errorprone/AfterburnerJavaIncompatibility

AfterburnerModuleは jdk16+ では 互換性がなく、ランタイムに失敗を引き起こします。AfterburnerModuleを取り除くか、ランタイムを考慮してconjure-java-jackson-optimizations の ObjectMapperOptimizations.createModules() に置き換えてください。

com/palantir/baseline/errorprone/AssertNoArgs

訳者注:

palantirのライブラリの話のようなので飛ばす

com/palantir/baseline/errorprone/AutoCloseableMustBeClosed

コンストラクタやメソッドで AutoCloseable を返すなら、 適切に呼び出し元でリソースをクローズすることを保証するために、@MustBeClosedアノテーションとして付与すべきです。

訳者注: error prone本体に、MustBeClosedChecker というのがあり、これを補助するためのルール

com/palantir/baseline/errorprone/AvoidNewHashMapInt

HashMap(int)HashSet(int) のコンストラクタは、誤解を招きます。 HashMap/HashSetは、与えられたサイズの 3/4 に達すると、リサイズされます。 代わりに、期待する挙動を示す、Maps.newHashMapWithExpectedSizeSets.newHashSetWithExpectedSize を使ってください。 より詳しい情報はこのドキュメントを読んでください。)

com/palantir/baseline/errorprone/BadAssert

  • Assert statements should not be used. Asserts are generally enabled in tests but disabled in production, which means code can execute in production that is impossible to test.\nIf you\'re confident that an \'assert\' is required, this check may be suppressed using @SuppressWarnings(\"BadAssert\")

assert statement は、使用すべきではありません。アサートは一般的にテストでは有効ですが、本番では無効です、つまり、testでは不可能なコードが、productionでは実行される可能性があります。もし、あなたが自信を持って、assert が必要ならば、このチェックは、@SuppressWarnings("BadAssert") で抑制しても良いでしょう。

訳者注:

assert statementは言語仕様の assert statement

com/palantir/baseline/errorprone/BugCheckerAutoService

  • Concrete BugChecker implementations should be annotated @AutoService(BugChecker.class) for auto registration with error-prone.

BugCheckerの実装は error-proneに自動登録するために、@AutoService(BugChecker.class) でアノテートされているべきです。

訳者注:

@AutoService を付与することで、annotation processorによって java.util.ServiceLoader に必要なファイルを自動生成してくれる。

com/palantir/baseline/errorprone/CardinalityEqualsZero

コレクションのサイズを確かめる代わりに、isEmptyを使ってください。

com/palantir/baseline/errorprone/CatchBlockLogException

catch節の中のログで、catchした例外をログに出力していません。

com/palantir/baseline/errorprone/CatchSpecificity

  • Prefer more specific error types than Exception and Throwable. When methods are updated to throw new checked exceptions they expect callers to handle failure types explicitly. Catching broad types defeats the type system. By catching the most specific types possible we leverage existing compiler functionality to detect unreachable code.\nNote: Checked exceptions are only validated by the compiler and can be thrown by non-standard bytecode at runtime, for example when java code calls into groovy or scala generated bytecode a checked exception can be thrown despite not being declared. In these scenarios we recommend suppressing this check using @SuppressWarnings(\"CatchSpecificity\") and a comment describing the reason. Remaining instances can be automatically fixed using ./gradlew compileJava -PerrorProneApply=CatchSpecificity

訳者メモ: 長いので後で見る

com/palantir/baseline/errorprone/CollectionStreamForEach

  • Collection.forEach is more efficient than Collection.stream().forEach

Collection.forEach は、Collection.stream().forEach より効率的です。

com/palantir/baseline/errorprone/CompileTimeConstantViolatesLiskovSubstitution

  • @CompileTimeConstant annotations on method parameters must also be applied to the super method. Similarly, if a superclass or superinterface is annotated, implementations must also be annotated.

メソッド引数の @CompileTimeConstant アノテーションは、スーパーメソッドにも適用されるべきです。もし、スーパークラス、スーパーインターフェースにアノテートされているなら、実装でもアノテートされているべきです。

訳者注:

@CompileTimeConstant は error prone annotations に含まれているアノテーションです。 See https://github.com/google/error-prone/blob/3369aaaa3359e8e01465521bd87e599541df4f05/annotations/src/main/java/com/google/errorprone/annotations/CompileTimeConstant.java

com/palantir/baseline/errorprone/ConjureEndpointDeprecatedForRemoval

訳者注:

Conjureは、palantir の ライブラリのようなので翻訳していません。

com/palantir/baseline/errorprone/ConsistentLoggerName

  • Loggers created using getLogger(Class<?>) must be named \'log\'.

getLogger(Class<?>) で作られたロガーは、log命名すべきです。

com/palantir/baseline/errorprone/ConsistentOverrides

同じ型の複数のパラメータがあるなら、正しくない値の変数への束縛を避けるために、メソッドのオーバーライドは、変数名で、スーパーメソッドと一致するべきです。

com/palantir/baseline/errorprone/DangerousCollapseKeysUsage

訳者注:

one.util.streamex.EntryStream の話らしい。飛ばす。

com/palantir/baseline/errorprone/DangerousCompletableFutureUsage

Executor を指定しない、非同期処理は許可しません。

訳者注:

このルールは良い。

com/palantir/baseline/errorprone/DangerousIdentityKey

  • Key type does not override equals() and hashCode, so comparisons will be done on reference equality only. If neither deduplication nor lookup are needed, consider using a List instead. Otherwise, use IdentityHashMap/Set, or an Iterable/List of pairs.

Keyの型は、equals, hashCode をオーバーライドしていません。そのため、比較は参照比較のみ行われます。重複排除や検索も必要ないなら、Listを代わりに使うことを検討してください。それ以外の場合は、IdentityHashMap/Setもしくは、Iterable/Listのペアを使ってください。

com/palantir/baseline/errorprone/DangerousJavaDeserialization

セキュリティのために、JavaのSerializationの利用は許可しません。 参照: https://cwe.mitre.org/data/definitions/502.html

com/palantir/baseline/errorprone/DangerousJsonTypeInfoUsage

セキュリティのために、JacksonのType Information機能は利用しません。 参照: https://github.com/FasterXML/jackson-databind/issues/1599

訳者注:

JsonTypeInfo アノテーションを使って、JSONにあるクラス情報を元に、Deserilizeしようとすると 容易にRemote Code Executionの脆弱性が発生する。使ってはならない。

参照: https://fasterxml.github.io/jackson-annotations/javadoc/2.4/com/fasterxml/jackson/annotation/JsonTypeInfo.html

com/palantir/baseline/errorprone/DangerousParallelStreamUsage

Java streamsの .parallel() の利用はおすすめしません。

訳者注:

たぶん、ForkJoinPoolのcommonPoolに依存してて、IO処理をすると死ぬからかと思われる。 Executorを使え。

com/palantir/baseline/errorprone/DangerousRecordArrayField

  • Record type has an array field and hasn\'t overridden equals/hashcode. By default array equality performs reference equality only. Consider using an immutable Collection for the field, using Immutables instead of the record, or overriding equals/hashCode in the record.

配列をフィールドに持つレコード型で、eqauls/hashCodeをオーバーライドしていません。デフォルトでは、配列の同値性は、参照の同値性のみ実行されます。 フィールドに不変のコレクションを使うことを検討するか、recordを使わずに、Immutablesを使うか、eqauls/hashCode をオーバーライドしてください。

訳者注:

たぶん、Immutablesというのはこれ

com/palantir/baseline/errorprone/DangerousStringInternUsage

String.intern() は使うべきではない。

訳者注:

長いので、翻訳してない。原文を乗せておく。

# 原文
Should not use String.intern(). Java string intern is complex and unpredictable. In most cases intern performs worse than pure-java implementations such as Guava Interners (https://guava.dev/releases/27.0.1-jre/api/docs/com/google/common/collect/Interners.html). If you are confident that String.intern is the correct tool, please make sure you fully understand the consequences.
From https://shipilev.net/jvm/anatomy-quarks/10-string-intern/
> For OpenJDK, String.intern() is the gateway to native JVM String table, and it comes with
> caveats: throughput, memory footprint, pause time problems will await the users. It is very
> easy to underestimate the impact of these caveats. Hand-rolled deduplicators/interners are
> working much more reliably, because they are working on Java side, are just the regular Java
> objects, generally better sized/resized, and also can be thrown away completely when not needed
> anymore. GC-assisted String deduplication does alleviate things even more.
> In almost every project we were taking care of, removing String.intern() from the hotpaths, 
> or optionally replacing it with a handrolled deduplicator, was the very profitable performance
> optimization. Do not use String.intern() without thinking very hard about it, okay?

com/palantir/baseline/errorprone/DangerousThreadPoolExecutorUsage

直接ThreadPoolExecutorを使うことは許可しません。

訳者注:

ThreadPoolExecutorを直接使うと、よくあるバグが発生したりするので避けるべき。 ここのメッセージにも書いているが、corePoolSize != maxPoolSizeにして、unboundや大きいwork queueを持った時に発生する。 この場合、corePoolSizeより大きくならない。

日本語だとここなどに書かれている内容です。 参照: https://ik.am/entries/443

com/palantir/baseline/errorprone/DangerousThrowableMessageSafeArg

  • It is unsafe to create a SafeArg of Throwable.getMessage, SafeLoggable.getLogMessage may be used.

訳者注: palantir 内部の話のようなので飛ばす。 https://github.com/palantir/safe-logging とかいうライブラリがあるっぽい。

com/palantir/baseline/errorprone/DefaultLocale

デフォルトロケールの暗黙的利用。JVMの実行間で挙動が変わる可能性があります。

com/palantir/baseline/errorprone/DeprecatedGuavaObjects

標準ライブラリの java.util.Objects のUtilityは Guavaの com.google.common.base.Objects を置き換えます。

com/palantir/baseline/errorprone/DnsLookup

new InetSocketAddress(host, port) の呼び出しは、DNS lookupが発生し、すでに解決されているので、DNSの変更に追従することを妨げます。 加えて、これは、本質的にネットワークリクエストです。環境によっては、呼出のコストは、予想よりも大幅に高くなる場合があります。 このチェックは助言を目的としています。特定のケースでは、抑制しても良いですが、大体はおすすめできません。

com/palantir/baseline/errorprone/ExecutorSubmitRunnableFutureIgnored

ExecutorService.submit から 補足していない例外が、uncaught exception handlerによってログ出力されません、なぜなら返却された futureがfailuresのために見られていることを仮定しているからです。返却された futureを無視するときは、ExecutorService.execute を使うのが好ましいです、失敗は記録されるので。

訳者注:

ExecutorService.submitだと、Threadのuncaught exception handlerによって処理されない? ちょっと別で確かめたい。

com/palantir/baseline/errorprone/ExtendsErrorOrThrowable

  • Class should not extend Error or Throwable directly. While allowed by java it can lead to surprising behaviour if users end up catching Error or Throwable.

クラスは、直接ErrorやThrowableを継承すべきではない。Javaでは許可されていますが、もし、ユーザがErrorやThrowableをキャッチしたなら、それは予期しない挙動を引き起こす可能性があります。

com/palantir/baseline/errorprone/FilterOutputStreamSlowMultibyteWrite

void write(byte[], int, int) をオーバーライドしてください。さもなくば、このOutputStreamへのマルチバイトの書き込みは遅い可能性があります。

訳者注:

どうすればええんやろか。実際にオーバーライドされているやつ見たい気もするが 一旦スキップ。

com/palantir/baseline/errorprone/FinalClass

コンストラクタの全てがprivateなら、クラスは finalで宣言すべきです。Utilityクラス、つまり、クラスの全てのメソッドやフィールがstaticで、privateで何もしない引数を持たないコンストラクタ。 https://github.com/palantir/gradle-baseline/tree/develop/docs/best-practices/java-coding-guidelines#private-constructors

com/palantir/baseline/errorprone/ForbidJavaxParameterType

javax.ws.rsのような古いjavaxの型を使っているオブジェクトを より新しいjakartaの型を必要としているメソッドに指定すると、実行時エラーになります。 このチェックは、型のないObjectを単に取る一般的なそれらのメソッドにあなたが適切に型を指定していることを確かめています。 このチェックには auto-fixはありません。手動で直す必要があります。

com/palantir/baseline/errorprone/GradleCacheableArgumentProvider

gradle argument providersを ラムダ式で実装することは禁止します。

com/palantir/baseline/errorprone/GradleCacheableTaskAction

gradle task actions (doFirst, doLast) を ラムダ式で実装することは禁止します。

com/palantir/baseline/errorprone/GradleProviderToString

ProviderのtoStringを呼んでも、中に入っている値はレンダリングされない。

com/palantir/baseline/errorprone/GuavaPreconditionsMessageFormat

Guava Preconditions.checkX() の メソッドは、print-f のフォーマットを使うべきです。

com/palantir/baseline/errorprone/IllegalSafeLoggingArgument

訳者注:

safe-loggingの話なので、飛ばす。

com/palantir/baseline/errorprone/ImmutableMapDuplicateKeyStrategy

  • ImmutableMap.Builder.build() has non-obvious behavior, throwing on duplicate keys. Please use \'buildKeepingLast()\' or \'buildOrThrow()\' for more obvious behavior.

ImmutableMap.Builder.build() は自明ではない挙動を持ち、重複したキーの場合例外を投げます。 より自明な挙動のために buildKeepingLast()buildOrThrow() を使ってください。

com/palantir/baseline/errorprone/ImmutablesBuilderMissingInitialization

Immutables builder の必要な全てのフィールドは、初期化されるべきです。

com/palantir/baseline/errorprone/ImmutablesReferenceEquality

値の同値性の代わりに、参照の同値性によって、Immutablesの値の比較をしている。

com/palantir/baseline/errorprone/ImmutablesStyle

訳者注: どうせImmutables使ってないし、面倒くさくなったので飛ばす

終わり

残りは別の記事で・・・