Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Условные директивы компилятору


Автор: Mirkes 27.10.2011, 18:04
Я создал серию сомпонентов, включаемых в JTabbedPane. 
Мне нужна возможнось включать в компилируемый апплет только часть разработанных компонентов.
Причем иногда одну часть, иногда - другую.

Создание экземпляров объектов и их включение в JTabbedPane происходит следующим образом:
Код

    private PCA pca = new PCA(cursHandl);
    private SOM som = new SOM(cursHandl);
    private GSOM gsom = new GSOM(cursHandl);
    private GSOM1 gsom1 = new GSOM1(cursHandl);
    private GSOM2 gsom2 = new GSOM2(cursHandl);
    private GSOM3 gsom3 = new GSOM3(cursHandl);
    private EM em = new EM(cursHandl);
    
    private StdData stdData= new StdData(cursHandl);
    private DeskTop deskTop = new DeskTop();
    private MyPane mLabel = new MyPane();
    private MyTabbedPane jTabbedPane = new MyTabbedPane();
    
    
    private void jbInit() throws Exception {
        this.getContentPane().setLayout(null);
        this.setBounds(new Rectangle(0, 0, 600, 520));
        this.setLayout(null);
        jTabbedPane.setBounds(new Rectangle(0, 0, 415, 120));

        cursHandl.setDeskTop(deskTop);
        mData.setDeskTop(deskTop);
        mData.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("Data set", mData);
        
        pca.setDeskTop(deskTop);
        pca.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("PCA", pca);
        
        som.setDeskTop(deskTop);
        som.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("SOM", som);
        
        gsom.setDeskTop(deskTop);
        gsom.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("GSOM", gsom);
        
        gsom1.setDeskTop(deskTop);
        gsom1.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("GSOM1", gsom1);

        gsom2.setDeskTop(deskTop);
        gsom2.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("GSOM2", gsom2);

        gsom3.setDeskTop(deskTop);
        gsom3.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("GSOM3", gsom3);
        
        em.setDeskTop(deskTop);
        em.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("EM", em);
        
        stdData.setDeskTop(deskTop);
        stdData.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("Std. data", stdData);


Хотелось бы управлять набором включаемых панелей без ползанью по тексту и комментирования исключаемых фрагментов.
В Delphi для этого импользуются условные директивы компилятора типа 

Код

    {$IF DEF PCA}
    private PCA pca = new PCA(cursHandl);
    {$ENDIF}
    private SOM som = new SOM(cursHandl);
    private GSOM gsom = new GSOM(cursHandl);
    private GSOM1 gsom1 = new GSOM1(cursHandl);
    private GSOM2 gsom2 = new GSOM2(cursHandl);
    private GSOM3 gsom3 = new GSOM3(cursHandl);
    private EM em = new EM(cursHandl);
    
    private StdData stdData= new StdData(cursHandl);
    private DeskTop deskTop = new DeskTop();
    private MyPane mLabel = new MyPane();
    private MyTabbedPane jTabbedPane = new MyTabbedPane();
    
    
    private void jbInit() throws Exception {
        this.getContentPane().setLayout(null);
        this.setBounds(new Rectangle(0, 0, 600, 520));
        this.setLayout(null);
        jTabbedPane.setBounds(new Rectangle(0, 0, 415, 120));

        cursHandl.setDeskTop(deskTop);
        mData.setDeskTop(deskTop);
        mData.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("Data set", mData);
        
        {$IFDEF PCA}
        pca.setDeskTop(deskTop);
        pca.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("PCA", pca);
        {$ENDIF}
        
        som.setDeskTop(deskTop);
        som.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("SOM", som);
        
        gsom.setDeskTop(deskTop);
        gsom.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("GSOM", gsom);
        
        gsom1.setDeskTop(deskTop);
        gsom1.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("GSOM1", gsom1);

        gsom2.setDeskTop(deskTop);
        gsom2.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("GSOM2", gsom2);

        gsom3.setDeskTop(deskTop);
        gsom3.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("GSOM3", gsom3);
        
        em.setDeskTop(deskTop);
        em.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("EM", em);
        
        stdData.setDeskTop(deskTop);
        stdData.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("Std. data", stdData);


Есть ли такие возможности в Java?
Просмотрел форум поиском - ничего не нашел.

Автор: LSD 27.10.2011, 18:13
Ни препроцессора, ни директив компиляции в Java нет. Общая рекомендация это publis static final boolean флаги:
Код

publis static final boolean PCA= false;
...

      if(PCA) {// этот кон не будет включен в класс компилятором
        pca.setDeskTop(deskTop);
        pca.setTabbedPane(jTabbedPane);
        jTabbedPane.addTab("PCA", pca);
      }


Автор: Mirkes 27.10.2011, 18:44
Спасибо. Понял.

Еще один связанный вопрос.
В jar включаются все классы проекта (пакета). Можно ли этого избежать? Чтобы включались только используемые?

Автор: LSD 27.10.2011, 19:08
Цитата(Mirkes @  27.10.2011,  19:44 Найти цитируемый пост)
В jar включаются все классы проекта (пакета). Можно ли этого избежать? Чтобы включались только используемые?

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

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

Автор: Mirkes 28.10.2011, 05:22
Я работаю в JDeveloper 11. 
В момент сборки апплета доподлинно известен набор используемых классов. Можно, конечно их руками удалять из каталога classes, но боюсь что при выгрузке их опять добавят. Можно, конечно влезть в Jar  и убрать оттуда. Но хотелось бы это сделать штатными средствами.

Автор: math64 28.10.2011, 07:39
Код

public interface IPCA {
 void setCursor(Cursor cursor);
 void setDeskTop(DeskTop desktop);
 void setTabbedPane(MyTabbedPane jTabbedPane);
};

Код

// Компилировать отдельно
public class PCA implements IPCA {
}

Код

private IPCA pca;
public static boolean final hasPCA = false; //final при необходимости можно убрать

if (hasPCA) {
  // Добавить обработку исключений
  Class pcaClass = Class.forName("PCA"); // можно указать свой ClassLoader
  pca = (IPCA)pcaClass().newInstance();
  pca.setCursor(cursor);
  pca.setDeskTop(desktop);
  pca.setTabbedPane(jTabbedPane);
}

Автор: LSD 28.10.2011, 10:20
Цитата(Mirkes @  28.10.2011,  06:22 Найти цитируемый пост)
Я работаю в JDeveloper 11. 
В момент сборки апплета доподлинно известен набор используемых классов. Можно, конечно их руками удалять из каталога classes, но боюсь что при выгрузке их опять добавят. Можно, конечно влезть в Jar  и убрать оттуда. Но хотелось бы это сделать штатными средствами. 

Перейди на нормальную систему сброки проекта ANT или Maven. Там можно фильтровать контент который стоит включать в jar. Можно ли это сделать в JDeveloper я не знаю.

Автор: Skipy 28.10.2011, 13:20
Цитата(Mirkes @ 28.10.2011,  05:22)
В момент сборки апплета доподлинно известен набор используемых классов.

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

Автор: Mirkes 28.10.2011, 17:51
Спасибо всем. 

Цитата

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


Я имел в виду разработанные мной классы. О них я имею точную информацию.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)