Java: есть ли поддержка макросов? - PullRequest
18 голосов
/ 14 ноября 2009

Мне просто интересно, как люди решают это. Я часто пишу один и тот же тип кода все время. Например:

new Thread() {
   //...
   //...
   //...
   //Change this line
   //...
   //...
}.start();

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

Ответы [ 7 ]

21 голосов
/ 14 ноября 2009

Ну, я полагаю, вы можете запускать ваши java-файлы через препроцессор C ...

18 голосов
/ 14 ноября 2009

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

public abstract class ThreadTemplate extends Thread
{

    public void run() {
        //reusable stuff
        doInThread();
        //more resusable stuff
    }

    abstract void doInThread();

}

Тогда запуск резьбы с кодом шаблона так же прост, как:

new ThreadTemplate{
   void doInThread() {
       // do something
   }
}.start();

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

8 голосов
/ 14 ноября 2009

Один из методов - поместить код в анонимный внутренний класс и передать его методу, который делает все остальное.

interface SomeInterface {
    void fn();
}

    executeTask(new SomeInterface {
        public void fn() {
            // Change this line.
        }
    });

private void executeTask(final SomeInterface thing) {
     Thread thread = new Thread(new Runnable() { public void run() {
        //...
        //...
        //...
        thing.fn();
        //...
        //...
     }});
     thread.start();
}

Обычно не рекомендуется расширять Thread или другие классы, если в этом нет необходимости.

7 голосов
/ 14 ноября 2009

Возможно использовать аннотации Java для генерации стандартного кода. Написание собственного процессора аннотаций не сложно.

1 голос
/ 14 ноября 2009

Если это то, что вы используете во многих проектах, я бы настроил это в вашей IDE. Например, я использую затмение, и если вы идете в Окно-> Настройки-> Java-> Редактор-> Шаблоны вы можете настроить свои собственные шаблоны, а затем автоматически заполнить их. Например, я всегда начинаю вводить sysout, а затем нажимаю tab, и eclipse имеет встроенный шаблон, чтобы заменить его на System.out.println ();

В eclipse есть много готовых шаблонов, поэтому вы можете посмотреть на них примеры синтаксиса, если вы используете IDE, если нет, то в других IDE может быть что-то похожее

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

0 голосов
/ 14 ноября 2009

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

Итак, решение состоит в том, чтобы создать свой собственный класс:

public class MyClass implements Runnable {
    void run() {
        // change this line
    }
}

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

new Thread(new MyClass()).start();

Вы также можете добавить переменные в MyClass и конструктор, чтобы вы могли передавать ему аргументы.

Редактировать: Если вам нужно больше, чем просто метод запуска, вы также можете создать подкласс Thread.

0 голосов
/ 14 ноября 2009

Нет, макросов нет. В этом случае самое близкое, что вы можете получить, - это создать новый экземпляр Runnable и передать его либо функции собственного создания, либо ExecutorService, которая запустит задачу за вас.

В Java нет хорошего способа избавиться от этого «стандартного» кода, в основном потому, что вы не можете передавать указатели на функции; все должно быть объектом.

...