Использование анонимных классов в Java рассмотрено, плохо разрабатывают или хороший?

Ниже для стандартного SQL BigQuery

В случае, если вас интересует максимальное количество дней подряд пользователей на одном рабочем месте:

#standardSQL
SELECT uid, MAX(consecuitive_days) max_consecuitive_days
FROM (
  SELECT uid, grp, COUNT(1) consecuitive_days
  FROM (
    SELECT uid, 
      COUNTIF(step > 1) OVER(PARTITION BY uid, worksite_id ORDER BY ts) grp
    FROM (
      SELECT uid, worksite_id, ts, 
        DATE_DIFF(ts, LAG(ts) OVER(PARTITION BY uid, worksite_id ORDER BY ts), DAY) step 
      FROM `project.dataset.table`
    )
  ) GROUP BY uid, grp
) GROUP BY uid  

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

#standardSQL
SELECT uid, MAX(consecuitive_days) max_consecuitive_days
FROM (
  SELECT uid, grp, COUNT(1) consecuitive_days
  FROM (
    SELECT uid, 
      COUNTIF(step > 1) OVER(PARTITION BY uid ORDER BY ts) grp
    FROM (
      SELECT uid, ts, 
        DATE_DIFF(ts, LAG(ts) OVER(PARTITION BY uid ORDER BY ts), DAY) step 
      FROM `project.dataset.table`
    )
  ) GROUP BY uid, grp
) GROUP BY uid  

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'u12345' uid, 'worksite_1' worksite_id, DATE '2019-01-01' ts UNION ALL
  SELECT 'u12345', 'worksite_1', '2019-01-02' UNION ALL
  SELECT 'u12345', 'worksite_1', '2019-01-03' UNION ALL
  SELECT 'u12345', 'worksite_1', '2019-01-04' UNION ALL
  SELECT 'u12345', 'worksite_1', '2019-01-06' UNION ALL
  SELECT 'u1', 'worksite_1', '2019-01-01' UNION ALL
  SELECT 'u1', 'worksite_1', '2019-01-02' UNION ALL
  SELECT 'u1', 'worksite_1', '2019-01-05' UNION ALL
  SELECT 'u1', 'worksite_1', '2019-01-06' 
)
SELECT uid, MAX(consecuitive_days) max_consecuitive_days
FROM (
  SELECT uid, grp, COUNT(1) consecuitive_days
  FROM (
    SELECT uid, 
      COUNTIF(step > 1) OVER(PARTITION BY uid ORDER BY ts) grp
    FROM (
      SELECT uid, ts, 
        DATE_DIFF(ts, LAG(ts) OVER(PARTITION BY uid ORDER BY ts), DAY) step 
      FROM `project.dataset.table`
    )
  ) GROUP BY uid, grp
) GROUP BY uid   

с результатом: [ 118]

Row uid     max_consecuitive_days    
1   u12345  4    
2   u1      2    
37
задан ArtBears 2 August 2014 в 22:42
поделиться

10 ответов

Я склонен использовать анонимные внутренние классы в ситуациях, где у меня не должно быть полноценного класса только для выполнения некоторой задачи. Например, если бы я хочу реализовать ActionListener или Runnable, но я не думаю, имея внутренний класс, было бы необходимо. Например, для запуска простого Thread, с помощью анонимного внутреннего класса могло бы быть более читаемым:

public void someMethod()
{
    new Thread(new Runnable() {
        public void run()
        {
            // do stuff
        }
    }).start();
}

В определенных случаях, таких как пример выше, это может увеличить удобочитаемость, специально для одноразовых задач, поскольку код, который должен быть выполнен, все написан в одном месте. Используя внутренний класс "делокализовал" бы код:

public void someMethod()
{
    new Thread(new MyRunnable()).start();
}

// ... several methods down ... //

class MyRunnable implements Runnable
{
    public void run()
    {
        // do stuff
    }
}

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

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

30
ответ дан coobird 27 November 2019 в 04:37
поделиться

Нет ничего по сути различного или особенное об анонимных классах. Они - в конечном счете просто синтаксический сахар с поддержкой ссылки на внешний класс. Это помогает создать адаптеры - точно так же, как большинство реализаций Итератора, возвращенных платформой Наборов.

0
ответ дан Peter Mortensen 27 November 2019 в 04:37
поделиться

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

, Если необходимо начать объявлять, что переменные как финал размещают скоро класс, так как он ссылается на них, затем используйте внутренний класс вместо этого. Я также видел некоторые плохие запахи кода, где финал выстраивает (размера 1), используются для возврата результатов скоро классов.

0
ответ дан Robin 27 November 2019 в 04:37
поделиться

Я использую Анонимные классы главным образом a) краткая нотация, если интерфейс имеет один или два метода и ее влияние привычки удобочитаемость

b) ситуация, где я привычка смочь выровнять по ширине создание нового класса, например, В колебании, когда необходимо присоединить actionlistner к, позволяю JButton для некоторой тривиальной операции.

0
ответ дан 27 November 2019 в 04:37
поделиться

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

момент Вы копируете ту же функцию, это становится плохой идеей. Осуществите рефакторинг его в общедоступный класс, который стоит самостоятельно. IDE с рефакторингом функций делают это легким.

1
ответ дан duffymo 27 November 2019 в 04:37
поделиться

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

1
ответ дан Megacan 27 November 2019 в 04:37
поделиться

Это зависит, с чем Вы сравниваете их. Я имел бы их, чем не имел бы их, но затем я смог бы предоставить простые блоки кода к методам как Arrays.sort (), чем имеющий необходимость явно создать класс, содержащий мою реализацию, выдерживают сравнение ().

1
ответ дан Stephen Denne 27 November 2019 в 04:37
поделиться

Я использую анонимные классы главным образом для интерфейсов, которые имеют только отдельный метод, т.е. Выполнимый или ActionListener. Большинство больших интерфейсов гарантирует свои собственные классы или реализацию в уже существующем классе. И поскольку это - мое мнение я, don’t нужны аргументы для поддержки его.

3
ответ дан Bombe 27 November 2019 в 04:37
поделиться

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

6
ответ дан boutta 27 November 2019 в 04:37
поделиться

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

11
ответ дан Peter Mortensen 27 November 2019 в 04:37
поделиться
Другие вопросы по тегам:

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