Краткое изложение подводных камней констант Java

Java

Это 4-й день моего участия в Gengwen Challenge, смотрите подробности мероприятия:Обновить вызов

1. Предпосылки

В моей повседневной работе раз в несколько дней проводится релиз для решения различных ошибок и оптимизаций, встречающихся в продакшене, но в силу каких-то накопившихся причин при обновлении некоторых проектов не удается обновить jar-пакет, обычно заменяется весь пакет по классу в пакете. Мы стараемся, чтобы эта старая система работала какое-то время. Однако в процессе выпуска мы столкнулись с небольшой проблемой, мы изменили только постоянный класс, поэтому в то время был обновлен только этот класс. В процессе тестирования было установлено, что измененное содержимое не возымело действия. После некоторого расследования было установлено, что проблема была вызвана неправильным использованием констант. меры по предотвращению ям.

2. Что такое константа

Константы относятся к данным, значение которых остается неизменным на протяжении всей операции, обычно задаются непосредственно в командах или программах.Типы данных, используемые в качестве констант, включают числовые, символьные, даты, логические, валютные и т. д. Типы.

3. Константы в java

В языке Java ключевое слово final в основном используется для определения констант Обычно мы будем использовать ключевое слово final для определения констант.public static finalдля украшения (константа времени компиляции).

    package com.kevin.test01;

    public class Const
    {
      public static final String sun = "SUN";
      public static final String supperFileType = "exe;jar;class";
    }

4. Отладка экземпляра

Давайте сначала напишем экземпляр используемой константы

package com.kevin.test01;

public class Const {
	 public static final String sun = "SUN";
         public static final String supperFileType = "exe;jar;class";
}

package com.kevin.test01;

public class Common {
	public static void main(String [] args){
		StringBuffer txt = new StringBuffer();
		txt.append("支持的文件类型");
		txt.append(Const.supperFileType);
		System.out.println(txt.toString());
	}
}

Результаты приведены ниже:

image.png

Давайте декомпилируем эти два класса с помощью инструмента декомпиляции jd-gui, чтобы увидеть, как выглядит скомпилированное содержимое.

Сначала посмотрите на содержимое класса Const, здесь нет проблем.

image.png

Давайте посмотрим на класс Common, который ссылается на константы. Мы обнаружим, что после декомпиляции местом, где на константу ссылается, является не имя константы, а значение константы. Если мы ссылаемся на константы таким образом во многих местах в code, то можно обновить только весь пакет jar пакета, а это еще и увеличивает риск появления в нем других проблем, так как же не наткнуться случайно на такую ​​яму?

image.png

5. Одно из предложений по использованию констант

1. При ссылке на константы не ссылайтесь напрямую на имя константы, а добавьте метод get в класс константы.

package com.kevin.test01;

public class Const {
	 static final String sun = "SUN";
	 static final String supperFileType = "exe;jar;class";
	 public static String getConst(String constName){
	    switch(constName){
	    	case "sun" :
                    return sun;
		case "supperFileType":
                    return supperFileType;
	    	default: 
                    return null;
	    	}
	    }
}

Там, где нам нужно обратиться к константам, мы напрямую используем статический метод в классе констант для получения

package com.kevin.test01;

public class Common {
	public static void main(String [] args){
		StringBuffer txt = new StringBuffer();
		txt.append("支持的文件类型");
		txt.append(Const.getConst("supperFileType"));
		System.out.println(txt.toString());
	}
}

Ниже приведен декомпилированный контент,

image.png

image.png

После декомпиляции мы видим, что место ссылки на константу уже не константное значение, а вызывается статический метод, который позволяет прекрасно избежать многих неопределенностей, вызванных прямой ссылкой, и есть много очень хороших методов, которые будут подробно описано в последующих статьях.