Стремительная инициализация через статический блок - PullRequest
0 голосов
/ 23 ноября 2018

Поскольку я пытаюсь понять вещи лучше, я понимаю, как мало я знаю.Извините, если это звучит как простой или глупый вопрос.

Действительно ли нам нужен статический блок, если он предназначен ТОЛЬКО для инициализации переменных STATIC без какой-либо другой логики, закодированной в блоке.Мы можем напрямую выполнить рьяную инициализацию этих статических переменных, верно?Потому что, насколько я понимаю, статический блок выполняется при загрузке класса, как и инициализация статических переменных.И если это только для инициализации переменных, недостаточно для того, чтобы инициализировать статическую переменную вместо того, чтобы иметь для этого эксклюзивный статический блок.

Например, возьмите следующий код и вызовите егоСлучай 1.

static String defaultName = null;
static String defaultNumber = 0;
static {
defaultName  = "John";
defaultNumber = "+1-911-911-0911";
}     

И следующий код, и назовите его Случай 2.

static String defaultName = "John";
static String defaultNumber = "+1-911-911-0911";

Итак, не Случай 1 и Случай 2 дают одинаковый результат или производительность.Нужен ли статический блок вообще в подобных случаях (для таких целей, как удобочитаемость, например, инициализация всех данных в одном месте или около того), в то время как случай 2 служит цели чисто и ясно?Чего мне не хватает?

Ответы [ 4 ]

0 голосов
/ 23 ноября 2018

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

private static int n;
private static String s;
static {
    if (someExpensiveOperation()) {
        n = 123;
        s = "foo";
    } else {
        n = 456;
        s = "bar";
    }
}
0 голосов
/ 23 ноября 2018

Очевидно, что никогда не предпочтет случай 1. Для случая 2 иногда инициализация является более сложной, чем это может быть сделано в одной строке.

public final class Stooges {

   private final static Map<String,String> stooges = new HashMap<>();
   static {
      stooges.put( "Larry", "Larry Fine" );
      stooges.put( "Moe", "Moe Howard" );
      stooges.put( "Curly", "Curly Howard" );
   }
}

Здесь вы не можете легко поставить инициализацию stooges в одной строке, поэтому статический блок облегчает (и делает его более читаемым для сопровождающего) инициализацию значений.

0 голосов
/ 23 ноября 2018

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

Пример:

public class R {

  public static int example;

  static {
    int example1 = 2 + 3;
    example = example1;
  }


  public static void main(String[] args) {
    System.out.println(example);   // print 5
  }

}

В случае, если значение равноуже известный, то может быть назначен напрямую (Случай 2);

0 голосов
/ 23 ноября 2018

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

...