Как импортировать статические функции в java? [Дубликат]

Мы оказываемся во вселенной, которая, по-видимому, развивается по измерению, которое мы называем «временем». Мы не понимаем, какое время, но мы разработали абстракции и словарный запас, которые позволяют рассуждать и говорить об этом: «прошлое», «настоящее», «будущее», «до», «после».

Компьютерные системы, которые мы строим - все больше и больше - имеют время как важное измерение. В будущем будут созданы определенные вещи. Тогда другие вещи должны произойти после того, как эти первые вещи в конечном итоге произойдут. Это основное понятие, называемое «асинхронность». В нашем мире с более сложной сетью наиболее распространенный случай асинхронности ожидает, что какая-то удаленная система ответит на какой-либо запрос.

Рассмотрим пример. Вы называете молочника и заказываете молоко. Когда это произойдет, вы хотите положить его в свой кофе. Вы не можете положить молоко в свой кофе прямо сейчас, потому что его еще нет. Вы должны подождать, пока это произойдет, прежде чем положить его в свой кофе. Другими словами, следующее не будет работать:

var milk = order_milk();
put_in_coffee(milk);

Поскольку JS не знает, что ему нужно дождаться окончания order_milk, прежде чем он выполнит put_in_coffee. Другими словами, он не знает, что order_milk является асинхронным - это то, что не приведет к молоку до некоторого будущего времени. JS и другие декларативные языки, выполняйте один оператор за другим, не ожидая.

Классический подход JS к этой проблеме, используя тот факт, что JS поддерживает функции как объекты первого класса, которые могут быть переданы, заключается в передаче функции в качестве параметра для асинхронного запроса, который затем будет вызываться, когда он будет выполнять свою задачу в будущем. Это подход «обратного вызова». Это выглядит так:

order_milk(put_in_coffee);

order_milk запускает, заказывает молоко, тогда, когда и только когда он прибывает, он вызывает put_in_coffee.

Проблема с этот подход обратного вызова состоит в том, что он загрязняет нормальную семантику функции, сообщающей свой результат с помощью return; вместо этого функции должны сообщать свои результаты, вызывая обратный вызов, заданный как параметр. Кроме того, этот подход может быстро стать громоздким при работе с более длинными последовательностями событий. Например, предположим, что я хочу дождаться, когда молоко будет помещено в кофе, а затем и только затем выполните третий шаг, а именно - выпить кофе. В конце концов мне нужно написать что-то вроде этого:

order_milk(function(milk) { put_in_coffee(milk, drink_coffee); }

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

В этом случае мы могли бы переписать код в вопросе как:

var answer;
$.ajax('/foo.json') . done(function(response) {
  callback(response.data);
});

function callback(data) {
  console.log(data);
}

Enter обещает

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

В случае нашего молока и кофе мы создаем order_milk, чтобы вернуть обещание о прибытии молока, затем укажите put_in_coffee как действие then следующим образом:

order_milk() . then(put_in_coffee)

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

order_milk() . then(put_in_coffee) . then(drink_coffee)

Давайте применим обещания к вашей конкретной проблеме. Мы завершим нашу логику запроса внутри функции, которая возвращает обещание:

function get_data() {
  return $.ajax('/foo.json');
}

На самом деле, все, что мы сделали, добавлено к return к вызову $.ajax. Это работает, потому что jQuery $.ajax уже возвращает вид обетоподобной вещи. (На практике, не вдаваясь в подробности, мы предпочли бы обернуть этот вызов, чтобы вернуть реальное обещание, или использовать некоторую альтернативу $.ajax, которая делает это.) Теперь, если мы хотим загрузить файл и дождаться его завершите, а затем сделайте что-нибудь, мы можем просто сказать

get_data() . then(do_something)

, например,

get_data() . 
  then(function(data) { console.log(data); });

. При использовании обещаний мы заканчиваем передачу множества функций в then, поэтому часто полезно использовать более компактные функции стрелок в стиле ES6:

get_data() . 
  then(data => console.log(data));

Ключевое слово async

Но все еще есть что-то неопределенное в том, что нужно писать код одним способом, если синхронно и совершенно по-другому, если асинхронно. Для синхронного мы пишем

a();
b();

, но если a является асинхронным, с обещаниями мы должны написать

a() . then(b);

Выше, мы сказали: «JS не имеет никакого способа узнать что ему нужно дождаться завершения первого вызова, прежде чем он выполнит второй ». Было бы неплохо, если бы можно было сказать JS? Оказывается, существует ключевое слово await, используемое внутри специального типа функции, называемого функцией «async». Эта функция является частью предстоящей версии ES, но уже доступна в транспилерах, таких как Babel, с учетом правильных настроек. Это позволяет нам просто написать

async function morning_routine() {
  var milk   = await order_milk();
  var coffee = await put_in_coffee(milk);
  await drink(coffee);
}

. В вашем случае вы могли бы написать что-то вроде

async function foo() {
  data = await get_data();
  console.log(data);
}
374
задан ROMANIA_engineer 19 May 2015 в 11:21
поделиться

8 ответов

См. Документация

Статическое объявление импорта аналогично обычной декларации импорта. Если стандартная декларация импорта импортирует классы из пакетов, что позволяет использовать их без квалификации пакета, статическое объявление импорта импортирует статические члены из классов, что позволяет использовать их без квалификации класса.

Итак, когда вы должны использовать статический импорт? Очень экономно! Используйте его только в том случае, если в противном случае у вас возникнет соблазн объявить локальные копии констант или злоупотреблять наследованием (Constant Interface Antipattern). Другими словами, используйте его, когда вам требуется частый доступ к статическим членам из одного или двух классов. Если вы злоупотребляете функцией статического импорта, это может сделать вашу программу нечитаемой и недостижимой, загрязняя ее пространство имен всеми статическими членами, которые вы импортируете. Читатели вашего кода (включая вас, через несколько месяцев после того, как вы его написали) не будут знать, из какого класса приходит статический член. Импорт всех статических элементов из класса может быть особенно вреден для удобочитаемости; если вам нужен только один или два члена, импортируйте их отдельно. Используемый надлежащим образом статический импорт может сделать вашу программу более читаемой, удалив шаблон повторения имен классов.

330
ответ дан RevanthKrishnaKumar V. 26 August 2018 в 01:25
поделиться

различие между «import static com.showboy.Myclass» и «import com.showboy.Myclass»?

Первый должен сгенерировать ошибку компилятора, поскольку статический импорт работает только для импорта полей или типов участников. (предполагая, что MyClass не является внутренним классом или участником шоу-шоу)

Я думаю, вы имели в виду

import static com.showboy.MyClass.*;

, который делает все статические поля и элементы из MyClass доступными в реальном модуле компиляции без чтобы их квалифицировать ... как объяснялось выше

22
ответ дан Carlos Heuberger 26 August 2018 в 01:25
поделиться

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

Я подробно рассмотрю пример.

import java.lang.Math;

class WithoutStaticImports {

 public static void main(String [] args) {
  System.out.println("round " + Math.round(1032.897));
  System.out.println("min " + Math.min(60,102));
 }
}

Тот же код со статическим импортом:

import static java.lang.System.out;
import static java.lang.Math.*;

class WithStaticImports {
  public static void main(String [] args) {
    out.println("round " + round(1032.897));
    out.println("min " + min(60,102));
  }
}

Примечание: статический импорт может сделать ваш код запутанным для чтения.

32
ответ дан Dheeraj vats 26 August 2018 в 01:25
поделиться

Модификатор static после import предназначен для извлечения / использования статических полей класса. Одна область, в которой я использую import static, предназначена для извлечения констант из класса. Мы также можем применить import static к статическим методам. Обязательно введите import static, потому что static import ошибочен.

Что такое static import в Java - JavaRevisited - очень хороший ресурс, чтобы узнать больше о import static.

1
ответ дан ImtiazeA 26 August 2018 в 01:25
поделиться

Скажите, что у вас есть статические поля и методы внутри класса myClass внутри пакета myPackage, и вы хотите получить к ним доступ напрямую, набрав myStaticField или myStaticMethod, не набирая каждый раз myClass.myStaticField или myClass.myStaticMethod.

Примечание: вам нужно выполнить импорт myPackage.MyClass или myPackage. * Для доступа к другим ресурсам

2
ответ дан Java Main 26 August 2018 в 01:25
поделиться

Статический импорт используется для импорта статических полей / метода класса вместо:

package test;

import org.example.Foo;

class A {

 B b = Foo.B_INSTANCE;

}

Вы можете написать:

package test;

import static org.example.Foo.B_INSTANCE;

class A {

 B b = B_INSTANCE;

}

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

Btw, в вашем примере «import static org.example.Myclass;» не будет работать: import для класса, import static - для статических членов класса.

51
ответ дан Nicolas 26 August 2018 в 01:25
поделиться

import позволяет java-программисту получить доступ к классам пакета без квалификации пакета.

Функция static import позволяет получить доступ к статическим членам класса без квалификации класса.

import обеспечивает доступность к классам и интерфейсу, тогда как static import обеспечивает доступность к статическим членам класса.

Пример:

С import

import java.lang.System.*;    
class StaticImportExample{  
    public static void main(String args[]){  

       System.out.println("Hello");
       System.out.println("Java");  

  }   
} 

С статический импорт

import static java.lang.System.*;    
class StaticImportExample{  
  public static void main(String args[]){  

   out.println("Hello");//Now no need of System.out  
   out.println("Java");  

 }   
} 

См. также: Что такое статический импорт в Java 5

12
ответ дан roottraveller 26 August 2018 в 01:25
поделиться

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

import org.apache.commons.lang.StringUtils;
      .
      .
      .
if (StringUtils.isBlank(aString)) {
      .
      .
      .

Я могу это сделать:

import static org.apache.commons.lang.StringUtils.isBlank;
      .
      .
      .
if (isBlank(aString)) {
      .
      .
      .
195
ответ дан Victor 26 August 2018 в 01:25
поделиться
Другие вопросы по тегам:

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