Задать вопрос
@artemfisher

Почему рефлексия выводит для конструктора перечисления больше параметров, чем по факту?

Есть класс перечисления
public enum Cities {
	
Moscow(45), Novosibirsk(50);
	
private int regionCode;
	
Cities(int regionCode)
{
	this.regionCode = regionCode;		
}
}


Вывожу его конструктор через рефлексию
Class<?> clazz = Cities.class;		
				
for(var c: clazz.getDeclaredConstructors())
{
	System.out.println(c.toGenericString());			
}


выводит:
private mainPackage.Cities(java.lang.String,int,int)

Почему параметров 3?
  • Вопрос задан
  • 122 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
al_gon
@al_gon
Если у Enum нет конструктора(конструктор по умалчанию) то по факту там 2 параметра. String представелние и порядковый номер.

protected Enum​(String name, int ordinal)

https://docs.oracle.com/en/java/javase/11/docs/api...

Если у Вас есть свой конструктор с одим аргументом, то после компиляции их будет 3.

UPDATE:
Здесь ещё пару слов о том, как именно всё происходит для Enum's

https://www.benf.org/other/cfr/how-are-enums-imple...

Я декомпилировал с CFR 0.151. (www.benf.org/other/cfr/index.html)

И именно этот декомпилятор с флажком --sugarenums false даёт результат который подтверждает рефлекшен.

/*                                                                                            
 * Decompiled with CFR 0.151.                                                                 
 */                                                                                           
package com.learning.enums;                                                             
                                                                                              
public final class City                                                                       
extends Enum<City> {                                                                          
    public static final /* enum */ City Moscow = new City("Moscow", 0, 45);                   
    public static final /* enum */ City Novosibirsk = new City("Novosibirsk", 1, 50);         
    private int regionCode;                                                                   
    private static final /* synthetic */ City[] $VALUES;                                      
                                                                                              
    public static City[] values() {                                                           
        return (City[])$VALUES.clone();                                                       
    }                                                                                         
                                                                                              
    public static City valueOf(String name) {                                                 
        return Enum.valueOf(City.class, name);                                                
    }                                                                                         
                                                                                              
    private City(String string, int n, int regionCode) {                                      
        super(string, n);                                                                     
        this.regionCode = regionCode;                                                         
    }                                                                                         
                                                                                              
    private static /* synthetic */ City[] $values() {                                         
        return new City[]{Moscow, Novosibirsk};                                               
    }                                                                                         
                                                                                              
    static {                                                                                  
        $VALUES = City.$values();                                                             
    }                                                                                         
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Видимо ты забыл сохранить изменения в файле, тк этот код выдаёт как и ожидалось:
private Cities(int)
https://java.godbolt.org/z/81xfr3fa4

enum Cities {

  Moscow(45),
  Novosibirsk(50);
	
  private int regionCode;
	
  Cities(int regionCode)
  {
	this.regionCode = regionCode;		
  }
}

class Main {

    public static void main(String[] args) {
        Class<?> clazz = Cities.class;		
				
        for(var c: clazz.getDeclaredConstructors())
        {
	        System.out.println(c.toGenericString());			
        }
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы