2013-06-24 4 views
4

Я не мог найти ответ на этот вопрос в Google, так что здесь.Можно ли использовать статический экземпляр в Java?

Можно ли использовать объект Static, чтобы остальная часть программы могла ссылаться на объект? Я точно не знаю, как уточнить мой вопрос, поэтому я просто покажу пример кода.

public class Client { 

    Frame f; 
    private static Client mainClient; 

    public static void main(String[] args){ 
     new Client().init(); 
    } 

    private void init(){ 

     mainClient = this; 
     f = new Frame(); 

    } 

    public static Client getClient() { 
     return mainClient; 
    } 

    public Frame getFrame(){ 
     return f; 
    } 
} 

Таким образом, допустимо ли использовать метод getClient() по всей программе, чтобы получить доступ к объекту кадра, в отличие от отправки его в качестве параметра (большинство) объектов я создаю? Кадр используется во всей программе, и добавление его в качестве параметра просто добавляет к каждому конструктору один параметр.

Thanks

+1

Важно отметить, что на самом деле нет такой вещи, как «статический экземпляр». Существуют статические * переменные *, но объект не является по своей сути статическим или нет. –

+1

@ Jtvd78 Короткий ответ: это абсолютно приемлемо. Просто следите за потокобезопасностью, если вы используете потоки. – emesx

+1

Было бы интересно спросить: 1) будет ли всегда один кадр в течение всего срока службы этого приложения, 2) нужно ли всем частям программы получить доступ ко всему кадру и 3) должна ли быть модель данных а не Frame. –

ответ

0

Это нормально. Вам было бы полезно прочитать о singleton pattern

+2

«ОК» завышает немного. Синглтон в наши дни довольно широко считается анти-паттерном. В большинстве случаев люди склонны не знать, где это должно быть * и не должны * использоваться, и в конечном итоге превращают все в одиночные. : P – cHao

0

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

1

Чтобы понять, может ли в вашем случае использовать шаблон Singleton, вы должны спросить: «Остается ли этот компонент неизменным в течение всего срока службы приложения?», Если да, то, вероятно, было бы лучше выделить его в классе самостоятельно.

1

То, что вы описываете, называется singleton pattern. Хотя есть некоторые критики, это часто используемый шаблон.

Второй альтернативой предоставлению объекта каждому конструктору будет dependency injection. Для Java одним из лучших вариантов будет Spring.

+1

В качестве альтернативы Spring я рекомендовал бы [guice] (https://code.google.com/p/google-guice/) – mariosangiorgio

+0

@mariosangiorgio как альтернативу Spring и Guice в среде Java EE 5+ Я бы рекомендовал использовать EJB 3 и/или CDI. –

0

Вы только что создали вариант SingleTon Pattern. Статический объект используется, когда вам нужен только один экземпляр этого объекта во всем проекте.

Основная структура Синглтон

public class Client { 
    private static Client mainClient; 


    private void Client(){ 
     // do initial tasks 
    } 

    public static Client getClient() { 
     if(mainClient == null) 
      mainClient = new Client(); 
     return mainClient; 
    } 

    public Frame getFrame(){ 
     return f; 
    } 
} 

SO вы можете получить кадр с помощью

Client.getClient().getFrame(); 
+0

Не уверен, хочет ли он ровно один экземпляр или простота доступа, вот что ... :) – Shark

6

Зависит от более чем одной вещи ...

1) Использование , Хотите ли вы сказать MyClass.getClient() и получить ссылку на переменную клиента? Если вы нацелены на одноэлементную вещь - да. Если вы нацелены на очень удобную вещь - да, если она безопасна, если вы просто хотите, чтобы она была видна повсюду - нет. Если доступ к нему из неправильного места/времени вызывает сбои и ошибки - нет.

2) Люди Люди будут использовать то, что вы выставили, период. Если они видят, что ваш код выбирает клиент таким образом, они будут использовать его, когда это будет неприемлемо, так что это вызовет множество ошибок? :)

3) Дизайн Действительно ли это действительно необходимо? Чище ли это передавать, как аргумент, чем иметь абсолютный доступ к нему в любое время?

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

+2

+1: * то, что работает для домашней работы, может не для корпоративного программного обеспечения * это чистое золото. –

0

Ну, эта реализация одноэлементного шаблона является той, которую я ненавижу больше всего. Хорошо, это очень легко закодировать его, но позже, если что-то нужно изменить, вам придется изменить его в миллионах мест. Для одноплодной шаблон я хотел бы использовать Dependency Injection - Инверсия Контроля шаблон с Singleton фабрики шаблон и оставить static переменные исключительно для констант (например, строки, числа ...).

Что касается вашего вопроса, все приемлемо. Реализация зависит от ваших требований к проекту.

+0

«все приемлемо» ??? –

+1

@ André: Да, каждая структура и концепция могут быть использованы в некотором контексте. Если бы это не так, это не было бы. Большая проблема заключается в том, чтобы знать, в каком контексте может использоваться конкретная концепция. – cHao

+0

@ Андре, что работает на корпоративное программное обеспечение, может быть не для домашней работы, и наоборот. – Shark

0

Использование статического экземпляра отлично подходит для констант/неизменяемых объектов.

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