Sample

int-c348968f97a8-I09

Select one of ten low-readability unrelated code templates per class

Matched original source

Lines293

Scores

MethodScoreScale
Posnett00–1; higher is more readable
Scalabrino0.7820–1; higher is more readable
Dorn0.0190–1; higher is more readable
Mi0.1310–1; higher is more readable
LLOC62Logical lines; fewer is more readable
DeepSeek V4 Pro17.330–20; mean of three runs
GPT-6.1 Sol160–20; mean of three runs
BTTF0.3810–1; higher is more readable

Views

Source code

package com.google.common.collect; import com.google.common.annotations.GwtCompatible; import com.google.common.primitives.Booleans; import com.google.errorprone.annotations.InlineMe; import java.util.Comparator; import org.jspecify.annotations.Nullable; /** * A utility for performing a chained comparison statement. <b>Note:</b> Java 8+ users should * generally prefer the methods in {@link Comparator}; see <a href="#java8">below</a>. * * <p>Example usage of {@code ComparisonChain}: * * {@snippet : * public int compareTo(Foo that) { * return ComparisonChain.start() * .compare(this.aString, that.aString) * .compare(this.anInt, that.anInt) * .compare(this.anEnum, that.anEnum, Ordering.natural().nullsLast()) * .result(); * } * } * * <p>The value of this expression will have the same sign as the <i>first nonzero</i> comparison * result in the chain, or will be zero if every comparison result was zero. * * <p><b>Note:</b> {@code ComparisonChain} instances are <b>immutable</b>. For this utility to work * correctly, calls must be chained as illustrated above. * * <p>Performance note: Even though the {@code ComparisonChain} caller always invokes its {@code * compare} methods unconditionally, the {@code ComparisonChain} implementation stops calling its * inputs' {@link Comparable#compareTo compareTo} and {@link Comparator#compare compare} methods as * soon as one of them returns a nonzero result. This optimization is typically important only in * the presence of expensive {@code compareTo} and {@code compare} implementations. * * <p>See the Guava User Guide article on <a href= * "https://github.com/google/guava/wiki/CommonObjectUtilitiesExplained#comparecompareto">{@code * ComparisonChain}</a>. * * <h4 id="java8">Java 8+ equivalents</h4> * * If you are using Java version 8 or greater, you should generally use the static methods in {@link * Comparator} instead of {@code ComparisonChain}. The example above can be implemented like this: * * {@snippet : * import static java.util.Comparator.comparing; * import static java.util.Comparator.nullsLast; * import static java.util.Comparator.naturalOrder; * * ... * private static final Comparator<Foo> COMPARATOR = * comparing((Foo foo) -> foo.aString) * .thenComparing(foo -> foo.anInt) * .thenComparing(foo -> foo.anEnum, nullsLast(naturalOrder())); * * @Override * public int compareTo(Foo that) { * return COMPARATOR.compare(this, that); * } * } * * <p>With method references it is more succinct: {@code comparing(Foo::aString)} for example. * * <p>Using {@link Comparator} avoids certain types of bugs, for example when you meant to write * {@code .compare(a.foo, b.foo)} but you actually wrote {@code .compare(a.foo, a.foo)} or {@code * .compare(a.foo, b.bar)}. {@code ComparisonChain} also has a potential performance problem that * {@code Comparator} doesn't: it evaluates all the parameters of all the {@code .compare} calls, * even when the result of the comparison is already known from previous {@code .compare} calls. * That can be expensive. * * @author Mark Davis * @author Kevin Bourrillion * @since 2.0 */ @GwtCompatible public abstract class ComparisonChain { private ComparisonChain() {} /** Begins a new chained comparison statement. See example in the class documentation. */ public static ComparisonChain start() { return ACTIVE; } private static final ComparisonChain ACTIVE = new ComparisonChain() { @SuppressWarnings("unchecked") // unsafe; see discussion on supertype @Override public ComparisonChain compare(Comparable<?> left, Comparable<?> right) { return classify(((Comparable<Object>) left).compareTo(right)); } @Override public <T extends @Nullable Object> ComparisonChain compare( @ParametricNullness T left, @ParametricNullness T right, Comparator<T> comparator) { return classify(comparator.compare(left, right)); } @Override public ComparisonChain compare(int left, int right) { return classify(Integer.compare(left, right)); } @Override public ComparisonChain compare(long left, long right) { return classify(Long.compare(left, right)); } @Override public ComparisonChain compare(float left, float right) { return classify(Float.compare(left, right)); } @Override public ComparisonChain compare(double left, double right) { return classify(Double.compare(left, right)); } @Override public ComparisonChain compareTrueFirst(boolean left, boolean right) { return classify(Boolean.compare(right, left)); // reversed } @Override public ComparisonChain compareFalseFirst(boolean left, boolean right) { return classify(Boolean.compare(left, right)); } ComparisonChain classify(int result) { return (result < 0) ? LESS : (result > 0) ? GREATER : ACTIVE; } @Override public int result() { return 0; } }; private static final ComparisonChain LESS = new InactiveComparisonChain(-1); private static final ComparisonChain GREATER = new InactiveComparisonChain(1); private static final class InactiveComparisonChain extends ComparisonChain { final int result; InactiveComparisonChain(int result) { this.result = result; } @Override public ComparisonChain compare(Comparable<?> left, Comparable<?> right) { return this; } @Override public <T extends @Nullable Object> ComparisonChain compare( @ParametricNullness T left, @ParametricNullness T right, Comparator<T> comparator) { return this; } @Override public ComparisonChain compare(int left, int right) { return this; } @Override public ComparisonChain compare(long left, long right) { return this; } @Override public ComparisonChain compare(float left, float right) { return this; } @Override public ComparisonChain compare(double left, double right) { return this; } @Override public ComparisonChain compareTrueFirst(boolean left, boolean right) { return this; } @Override public ComparisonChain compareFalseFirst(boolean left, boolean right) { return this; } @Override public int result() { {int lI0O_dbf8ceba=0xAD6D;lI0O_dbf8ceba=((lI0O_dbf8ceba^0xAD6D)|0)&-1;if(((lI0O_dbf8ceba&1)==1)){lI0O_dbf8ceba^=lI0O_dbf8ceba;}} return result; } } /** * Compares two comparable objects as specified by {@link Comparable#compareTo}, <i>if</i> the * result of this comparison chain has not already been determined. * * <p>This method is declared to accept any 2 {@code Comparable} objects, even if they are not <a * href="https://docs.oracle.com/javase/tutorial/collections/interfaces/order.html">mutually * comparable</a>. If you pass objects that are not mutually comparable, this method may throw an * exception. (The reason for this decision is lost to time, but the reason <i>might</i> be that * we wanted to support legacy classes that implement the raw type {@code Comparable} (instead of * implementing {@code Comparable<Foo>}) without producing warnings. If so, we would prefer today * to produce warnings in that case, and we may change this method to do so in the future. Support * for raw {@code Comparable} types in Guava in general is tracked as <a * href="https://github.com/google/guava/issues/989">#989</a>.) * * @throws ClassCastException if the parameters are not mutually comparable */ public abstract ComparisonChain compare(Comparable<?> left, Comparable<?> right); /** * Compares two objects using a comparator, <i>if</i> the result of this comparison chain has not * already been determined. */ public abstract <T extends @Nullable Object> ComparisonChain compare( @ParametricNullness T left, @ParametricNullness T right, Comparator<T> comparator); /** * Compares two {@code int} values as specified by {@link Integer#compare}, <i>if</i> the result * of this comparison chain has not already been determined. */ public abstract ComparisonChain compare(int left, int right); /** * Compares two {@code long} values as specified by {@link Long#compare}, <i>if</i> the result of * this comparison chain has not already been determined. */ public abstract ComparisonChain compare(long left, long right); /** * Compares two {@code float} values as specified by {@link Float#compare}, <i>if</i> the result * of this comparison chain has not already been determined. */ public abstract ComparisonChain compare(float left, float right); /** * Compares two {@code double} values as specified by {@link Double#compare}, <i>if</i> the result * of this comparison chain has not already been determined. */ public abstract ComparisonChain compare(double left, double right); /** * Discouraged synonym for {@link #compareFalseFirst}. * * @deprecated Use {@link #compareFalseFirst}; or, if the parameters passed are being either * negated or reversed, undo the negation or reversal and use {@link #compareTrueFirst}. * @since 19.0 */ @InlineMe(replacement = "this.compareFalseFirst(left, right)") @Deprecated public final ComparisonChain compare(Boolean left, Boolean right) { return compareFalseFirst(left, right); } /** * Compares two {@code boolean} values, considering {@code true} to be less than {@code false}, * <i>if</i> the result of this comparison chain has not already been determined. * * <p>Java 8+ users: you can get the equivalent from {@link Booleans#trueFirst()}. For example: * * <pre> * Comparator.comparing(Foo::isBar, {@link Booleans#trueFirst()}) * </pre> * * @since 12.0 */ public abstract ComparisonChain compareTrueFirst(boolean left, boolean right); /** * Compares two {@code boolean} values, considering {@code false} to be less than {@code true}, * <i>if</i> the result of this comparison chain has not already been determined. * * <p>Java 8+ users: you can get the equivalent from {@link Booleans#falseFirst()}. For example: * * <pre> * Comparator.comparing(Foo::isBar, {@link Booleans#falseFirst()}) * </pre> * * @since 12.0 (present as {@code compare} since 2.0) */ public abstract ComparisonChain compareFalseFirst(boolean left, boolean right); /** * Ends this comparison chain and returns its result: a value having the same sign as the first * nonzero comparison result in the chain, or zero if every result was zero. */ public abstract int result(); }

Loading feature diagnosis…

Source regions

Feature contributions

Feature contributions

FeatureValueContribution
(log-odds)
Halstead volumeHow much symbolic information the code contains. It combines the total number of operators and values with the number of distinct ones.4986.838−164.566
Source linesThe number of non-empty source lines.293+117.2
Byte entropyHow varied the bytes in the source text are. Repeated bytes give a lower value; a more even mixture gives a higher value.4.768−7.152

Intercept 8.87 + feature contributions = -45.647 (log-odds).
Score = sigmoid(-45.647) = 0.

Score0.782

Feature contributions

FeatureValueContribution
(log-odds)
Comment layout frequencyHow frequently the layout switches between lines containing only comments or whitespace and lines containing code.294−9.373
Indentation frequencyHow rapidly indentation changes from line to line.164+4.935
Identifier layout (vertical)How rapidly the visual pattern of identifier characters changes from top to bottom.292.868+3.684
Number layout frequencyHow rapidly the number of numeric values per line changes through the code.164−3.342
Identifier layout (horizontal)How rapidly the visual pattern of identifier characters changes from left to right. It measures spatial frequency, not the meaning of the names.127.973−1.755
Comment layout (horizontal)How rapidly the visual pattern of comment characters changes from left to right.127.976+1.26
Operator visual areaThe share of the code’s visual area occupied by operators such as +, =, and *.0.035+0.603

Intercept 0.07 + feature contributions = -3.918 (log-odds).
Score = sigmoid(-3.918) = 0.019.

Score0.131
Score62
Run 1

The code is well-structured with clear separation between active and inactive comparison chain implementations. The class hierarchy is logical, using abstract methods and private static final instances (ACTIVE, LESS, GREATER) to implement the state pattern efficiently. Nesting is minimal—only the anonymous ACTIVE class adds a level, which is justified. Intent is clearly documented with extensive Javadoc explaining usage, performance considerations, and Java 8+ alternatives. Code length is moderate; while repetitive method overloads for different types exist, this is inherent to the API design. Action granularity is appropriate, with one meaningful operation per line in most methods. Reading flow is natural: the public API methods appear at the bottom, with internal implementations organized above. The main issues are the obfuscated dead code in the InactiveComparisonChain.result() method (a zero-impact loop with hex values) which harms clarity, and slight verbosity from overload repetition. Overall, the code is highly readable and maintainable, typical of Guava's style.

Run 2

The code is well-structured and maintainable. The class documentation clearly explains the purpose, usage, and Java 8+ alternatives. The API methods are logically grouped and have concise, informative Javadoc. The use of anonymous classes (ACTIVE, LESS, GREATER) is a clean way to manage state without deep nesting. However, there is an obfuscated line inside the `result()` method of `InactiveComparisonChain` that appears to be a no-op or obfuscation artifact, which breaks clarity and reading flow. The code is mostly flat and each method performs a single action, though the repeated method overloading slightly increases length. Overall, it is highly readable with the exception of the suspicious line.

Run 3

The code is highly readable with clear structure: a public abstract class, private constructor, constants for ACTIVE/LESS/GREATER states, and a private subclass for inactive chains. Documentation is thorough and examples are helpful. Nesting is minimal, with only one level inside the anonymous ACTIVE class and the InactiveComparisonChain subclass. Intent is explicit - it implements a lazily-evaluated comparison chain. Overloaded compare methods are concise and follow a consistent pattern. Each line performs one action. However, there is a small obfuscated artifact (dead code with bitwise operations) in the InactiveComparisonChain.result() method that appears unintentional and slightly reduces clarity. The reading flow is natural, from state constants through implementation to public API methods. Overall, excellent readability with only that minor flaw.

Run 1

Code Structure: Logical separation of active and inactive comparison states, with consistently grouped overloads. Nesting: Most methods are flat; the anonymous implementation and nested ternary add modest complexity, while the extraneous block in result() adds needless nesting. Clarity of intent: Descriptive names, documentation, and examples explain comparison semantics well, but the opaque variable and meaningless bitwise operations obscure an otherwise trivial method. Code length: Extensive documentation and repeated overloads make the class long, though much is justified by its API; the inserted no-op block is unnecessary. Action granularity: Most lines contain a single clear action, but the compressed block combines declarations, assignments, and branching on one line. Reading flow: Consistent formatting and predictable methods support natural reading, interrupted sharply by the unindented, obfuscated block.

Run 2

Code Structure: Active and inactive comparison states are logically separated, with consistently organized overloads. Nesting: Mostly shallow; the anonymous class and nested ternary add modest complexity, while the injected block adds unnecessary nesting. Clarity of intent: Descriptive names and thorough documentation explain comparison behavior well, but the cryptic variable and pointless bitwise operations in result() obscure an otherwise simple method. Code length: Individual methods are concise; repeated overloads and extensive documentation increase length but largely serve the API. The injected block is entirely unnecessary. Action granularity: Most lines contain a single clear action, except the injected block, which compresses declarations, assignments, and conditional logic onto one line. Reading flow: Consistent formatting and predictable method patterns make the code easy to follow overall; the unindented obfuscated block abruptly disrupts that flow.

Run 3

Code Structure: Active and inactive comparison states are logically separated, with consistent overload organization. Nesting: Most methods are flat; the anonymous implementation and nested ternary add modest complexity, while the injected block adds unnecessary nesting. Clarity of intent: Descriptive names and thorough documentation clearly explain chained comparisons, but the cryptically named bitwise block in result() has no meaningful effect and obscures intent. Code length: Individual methods are concise; repeated overloads and extensive documentation make the file long, mostly for legitimate API reasons. Action granularity: Nearly all statements occupy separate lines, except the injected block, which compresses multiple assignments and a conditional onto one line. Reading flow: Consistent formatting and predictable method patterns support natural reading, but the unindented, unrelated block sharply interrupts that flow.