#2953·jadx

[core] New enum pattern with anonymous classes adds invalid synthetic constructor/ external vars with dx/d8

Author: nitram84Created Sep 11, 2026Updated Sep 12, 2026
LabelsbugCore

Issue details

I found a new enum pattern currently unhandled in jadx:

Example 1:

package jadx.test;

public enum EnumAnonymous1 {
  TEST {}
}

decompiles to:

package jadx.test;

/* JADX INFO: loaded from: classes.dex */
public enum EnumAnonymous1 {
    TEST { // from class: jadx.test.EnumAnonymous1.1
    };

    /* synthetic */ EnumAnonymous1(AnonymousClass1 x2) {
        this();
    }
}

Example 2: Same with arguments and test w/o DX/D8

package jadx.test;

public enum EnumAnonymous2 {
  TEST1("TEST1", 0) {
  };

  EnumAnonymous2(final String string, final int i) {}
}

without dx/d8 decompiles to:

package jadx.test;

/* JADX INFO: loaded from: jadx/test/EnumAnonymous2.class */
public enum EnumAnonymous2 {
    TEST1("TEST1", 0) { // from class: jadx.test.EnumAnonymous2.1
    };

    /* synthetic */ EnumAnonymous2(String x2, int x3, AnonymousClass1 x4) {
        this(x2, x3);
    }

    EnumAnonymous2(String string, int i) {
    }
}

and with dx/d8 to:

package jadx.test;

/* JADX WARN: Enum visitor error
jadx.core.utils.exceptions.JadxRuntimeException: Init of enum field 'TEST1' uses external variables
	at jadx.core.dex.visitors.EnumVisitor.createEnumFieldByConstructor(EnumVisitor.java:485)
	at jadx.core.dex.visitors.EnumVisitor.processEnumFieldByField(EnumVisitor.java:399)
	at jadx.core.dex.visitors.EnumVisitor.processEnumFieldByWrappedInsn(EnumVisitor.java:364)
	at jadx.core.dex.visitors.EnumVisitor.extractEnumFieldsFromFilledArray(EnumVisitor.java:349)
	at jadx.core.dex.visitors.EnumVisitor.extractEnumFieldsFromInsn(EnumVisitor.java:284)
	at jadx.core.dex.visitors.EnumVisitor.convertToEnum(EnumVisitor.java:153)
	at jadx.core.dex.visitors.EnumVisitor.visit(EnumVisitor.java:102)
 */
/* JADX WARN: Failed to restore enum class, 'enum' modifier and super class removed */
/* JADX INFO: loaded from: classes.dex */
public class EnumAnonymous2 {
    private static final /* synthetic */ EnumAnonymous2[] $VALUES;
    public static final EnumAnonymous2 TEST1;

    /* synthetic */ EnumAnonymous2(String x0, int x1, String x2, int x3, AnonymousClass1 x4) {
        this(x0, x1, x2, x3);
    }

    public static EnumAnonymous2 valueOf(String name) {
        return (EnumAnonymous2) Enum.valueOf(EnumAnonymous2.class, name);
    }

    public static EnumAnonymous2[] values() {
        return (EnumAnonymous2[]) $VALUES.clone();
    }

    static {
        String str = "TEST1";
        int i = 0;
        TEST1 = new EnumAnonymous2(str, i, str, i) { // from class: jadx.test.EnumAnonymous2.1
        };
        $VALUES = new EnumAnonymous2[]{TEST1};
    }

    private EnumAnonymous2(String str, int i, String string, int i2) {
        super(str, i);
    }
}

Relevant log output or stacktrace

no errors logged

Provide sample and class/method full name

See issue details.

Jadx version

1.5.6, latest git