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


Автор: Reptor 16.7.2007, 14:30
Вопрос таков: есть у меня несколько методов (сейчас они описаны просто в главном классе) и вызываются во вложеном классе. Я етот класс хочу вынести как отдельный и наследовать свой главный я уже не смогу. Так вот как мне можно луче вынести эти методы (это можно сказать не логика но очень выжная настройка некоторых возможностей) что б они были доступны отовсюду. Просто не хочу делать это отдельным классом так как по сути экземпляр там создавать несчего (это просто можно сказать набор функций). Как грамотно решить эту проблему? 

Автор: powerOn 16.7.2007, 14:39
Цитата(Reptor @  16.7.2007,  15:30 Найти цитируемый пост)
Просто не хочу делать это отдельным классом так как по сути экземпляр там создавать несчего (это просто можно сказать набор функций).

как самый простой вариант -  вынести методы в отдельный класс и сделать их статическими.

Автор: hamsterKSU 16.7.2007, 15:02
Цитата(powerOn @  16.7.2007,  13:39 Найти цитируемый пост)
как самый простой вариант -  вынести методы в отдельный класс и сделать их статическими.


или сингелтон

Автор: Reptor 17.7.2007, 10:24
Цитата

как самый простой вариант -  вынести методы в отдельный класс и сделать их статическими.

powerOn, это ж всеровно прийдётся создавать экземпляр или я что то недопонял.

Цитата

или сингелтон


А что такое сингелтон?


Автор: Domestic Cat 17.7.2007, 10:27
Код

static class Helpers
{
      public static int GetInt(Object obj) { ... }
}


.....

int i = Helpers.GetInt(obj);

Автор: hamsterKSU 17.7.2007, 10:49
в случае класса со статическими методами тебе не придется создавать класс. сампл такого класса привел Domestic Cat.
в случае сингелтона тебе придется создать класс всего один раз - принцип этого патерна. 
пример сингелтона
Код

class A{

 private static A instance;

 private A(){}

 public A instance(){

   if(instance==null)
      instance = new A();
   return instance;
 }

}

Автор: Maksym 17.7.2007, 12:47
Если методы не требуют хранения каких-то глобальных состояний, то синглетон не нужен.
Если же требуют, и при этом к коду возможен доступ из разных потоков, методы или состояния нужно будет засинхронизировать.

Автор: Reptor 17.7.2007, 17:14
Мне необходимо хранить глобальные переменные (к примеру там какието глобальные настройки которые часто используются ) они у меня сейчас вечно передаются в конструктора и там делаю новую переменную глобальную для этого класса а не всего проекта (как то глупо получается). Я могу в статическиом классе их объявить а потом просто использовать что б не передавать в конструкторы? 

Автор: chief39 17.7.2007, 17:53
Цитата(Reptor @  17.7.2007,  17:14 Найти цитируемый пост)
Мне необходимо хранить глобальные переменные (к примеру там какието глобальные настройки которые часто используются ) они у меня сейчас вечно передаются в конструктора и там делаю новую переменную глобальную для этого класса а не всего проекта (как то глупо получается). Я могу в статическиом классе их объявить а потом просто использовать что б не передавать в конструкторы?  

Если тебе нужны глобальные для всего приложения переменные - делай их 
Код

public static fina
l
в хелпере
и в секции 
Код

static{

}


инициализируй

Автор: Reptor 17.7.2007, 18:29
я что то не совсем понял как хочет сделать chief39

Автор: chief39 17.7.2007, 18:51
Код

class Helpers
{
      public static int GetInt(Object obj) { return 8; }


    public static final int MY_GLOBAL_VARIABLE_1;
    public static final int MY_GLOBAL_VARIABLE_2;
    public static final String MY_GLOBAL_VARIABLE_3;
    
    static{
        MY_GLOBAL_VARIABLE_1 = 5;
        MY_GLOBAL_VARIABLE_2 = (int)System.currentTimeMillis(); // тут не совсем плохо - лонг обрезаем до инта - просто сама идея
        MY_GLOBAL_VARIABLE_3 = System.getProperty("JAVA_HOME"); // короче, берёшь откуда угодно
    }
    
    
    
    // TEST
    public static void main(String[] args) {
        
        int i = Helpers.GetInt(new Object());
        int i1 = Helpers.MY_GLOBAL_VARIABLE_1;
        int i2 = Helpers.MY_GLOBAL_VARIABLE_2;
        String java_home = Helpers.MY_GLOBAL_VARIABLE_3;
    }
}

мдодифицировал домашнего кота

Автор: niasilil 20.7.2007, 16:14
или просто использовать http://java.sun.com/j2se/1.5.0/docs/guide/language/static-import.html

Автор: Reptor 20.7.2007, 17:55
я вот попробывал реализовать то что посоветовал Domestic Cat, так же нельзя объявлять класс как static.

И поэтому сразу вопрос. Зделав так как сказал chief39, собственно чем этот класс отличается от обычного?
Ведь если я зделаю методы static в любом классе я их буду видить. Даже в этом классе что они у меня сейча. В чём тогда отличие класса chief39, от других? И там есть void main(String[] args) зачем она? Я что то совсем потерялся как правельно всё это вынести?

Автор: Domestic Cat 20.7.2007, 18:06
Цитата(Reptor @  20.7.2007,  08:55 Найти цитируемый пост)
Domestic Cat, так же нельзя объявлять класс как static.


Извиняюсь, привык к шарпу.

Автор: chief39 20.7.2007, 19:23
Цитата(Reptor @  20.7.2007,  17:55 Найти цитируемый пост)
И поэтому сразу вопрос. Зделав так как сказал chief39, собственно чем этот класс отличается от обычного?

Ничем. Суть в самих переменных и способе инициализации. Запихать - в любой класс.

Цитата(Reptor @  20.7.2007,  17:55 Найти цитируемый пост)
Ведь если я зделаю методы static в любом классе я их буду видить.

Да.
Но.
Обычно такие константы выносят в отдельный класс и так его называют - типа GlobalConstants или типа того smile
Чтоб в одном месте хранить и править. Если эта переменная тоьлко в одном классе нужна - можешь её там запулить, а не в этих глобалах

Цитата(Reptor @  20.7.2007,  17:55 Найти цитируемый пост)
Даже в этом классе что они у меня сейча. В чём тогда отличие класса chief39, от других?

Ни в чём. Класс как класс. Обычный. суьт, опять-таки - в переменных и способе инициализации.

А то, что переменные статик позволяет делать

Код

Helpers.MY_GLOBAL_VARIABLE_1


вместо 
Код

Helpers hlp = new Helpers();
int i = hlp.MY_GLOBAL_VARIABLE_1;


То есть экземпляр класса(объект) не надо создавать для обращеиня к переменным этим.

Цитата(Reptor @  20.7.2007,  17:55 Найти цитируемый пост)
И там есть void main(String[] args) зачем она? Я что то совсем потерялся как правельно всё это вынести? 

Это всего лишь для запуска.
Чтоб не создаваьт новый класс и уже из него показывать как доступаться к этим переменным, сделал метод для теста этих переменных.
Точно так же будешь обращаться из своих других объектов любых классов. 
<имя_класса>.<имя_переменной>

Автор: math64 20.7.2007, 20:08
В примере у Domestic Cat - static class Helpers - вложенный.
В примере y chief39можно использовать итерфейс и потом делать implements:
Код

public interface Helpers {
   // public static final добавляется автоматически
   // static {} не разрешён, нужно делать присвоение сразу
    int five = 5;
    long memory = Runtime.getRuntime().totalMemory();
    String home = System.getProperty("JAVA_HOME");
}


Но это только если параметры действительно глобальные, при старте инициализируются и больше не меняются.
Если у тебя сервер обслуживающий 2 пользователей или открыты 2 документа и т.п, и у каждого свои параметры?
В сервлете есть специальный объект для запоминания (на уровне сервлета, сессии и приложения).
В прочих случаях можно поступить так:
Код

public class UserThread extends Thread {
   String userName;
   ....

   public UserThread(Runnable r, String userName, ....) {
      super(r);
      this.userName = userName;
   }

   public UserThread(Runnable r)
      super(r);
      this.userName = getUserName();
   }
   
   public static String getUserName() {
      UserThread currentThread = (UserThread)Thread.currentThread();
      return currentThread.userName;
  }
}

В Swing:
Код

public class ConfigPanel extends JPanel {
   String userName;
   public ConfigPanel(LayoutManager lm, String userName, ...) {
     super(lm);
     this.userName = userName;
     ...
   }
   public ConfigPanel(LayoutManager lm, ConfigPanel cp) {
     super(lm);
     this.userName = cp.userName;
   }

   public static String getUserName(Component c) {
      while(c != null) {
         if (c instranceof ConfigPanel)
           return ((ConfigPanel)c).userName;
         c = c.getParent();
      }
      return null;
   }
}


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