2016-07-11 5 views
-2

Я видел некоторый кусок коды выглядитСтатический или новый экземпляр для каждого объекта?

public class A { 

public void doSomething(B b) { 
    b.addSometing("queue1", getDefault()); 
    b.addSometing("queue2", getDefault()); 
    b.addSometing("queue3", getDefault()); 
} 

private C getDefault() { 
    C c = new C(); 
    c.setAutoCreate(true); 
    c.setExired(false); 
    c.setDelay(3500); 

    return c; 
}} 

если Ставит C c вара. (который по умолчанию для всех объектов класса A) для каждого объекта класса A, мы просто используем много памяти для больших объектов класса A, может быть, лучше сделать C c статическим? Мы создадим только один экземпляр класса C для всего класса и будем использовать его для каждого объекта класса A. Если мы делаем так, после этого кода понравится как

public class A { 
private static C c = new C(); 

static { 
    c.setAutoCreate(true); 
    c.setExired(false); 
    c.setDelay(3500); 
} 

public void doSomething(B b) { 
    b.addSometing("queue1", c); 
    b.addSometing("queue2", c); 
    b.addSometing("queue3", c); 
} 

}

Я думаю, что это лучший способ, возможно, я ошибаюсь. Пожалуйста, дайте мне совет.

+0

Последняя сделать что это не распространяется много смысла для меня, если добавить один и тот же экземпляр 'C' на карту для различных ключей, поэтому рассмотрим движение с' Map' в первое место, когда у вас есть только одно значение для нескольких ключей? – SomeJavaGuy

+3

_If_ вы используете статический экземпляр для значений по умолчанию, он должен быть _immutable_, иначе вы можете получить побочные эффекты. 'setAutocreate (true)' и т. д. не выглядит неизменным. – Thomas

+0

Если вы внесете какие-либо изменения в объект c в 'queue1', тогда объекты в 'queue2' и 'queue3' также будут изменены. Если это приемлемо, то ваши статические решения выглядят нормально. – Jeet

ответ

2

ответ на этот вопрос зависит от логики приложения и/или того, что A должно делать с экземпляром C. Если требуется только один экземпляр определенного объекта, я бы предложил использовать шаблон Singleton в Java https://en.wikipedia.org/wiki/Singleton_pattern.

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

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

Бест, Джулиан