2015-05-28 7 views
0

У меня есть код, который требует много времени, вы можете взять его как загружающую данные с диска (но определенно не только это). Но мне нужна эта часть кода только при инициализации, но она заканчивается, я могу использовать некоторый метод, связанный с ней напрямую и быстро.Где я должен поместить свой код в java?

Теперь я понятия не имею, где я должен положить этот кусок кода, вот моя идея: Я поместил его в конструктор в некоторый класс A, а затем в класс B, который должен вызвать некоторый метод в A много раз, поэтому я создаю новый экземпляр конструктора A в B, который очень идеален, потому что каждый раз, когда мне нужен метод A, я могу напрямую обращаться к нему, а конструктор A вызывается только один раз.

Но вот проблема: у меня есть еще один класс C, который генерирует много экземпляров B (новый B()), тогда каждый раз, когда C генерирует новый экземпляр B, будет вызываться конструктор A, это снова очень много времени, как я могу организовать свой код, чтобы этого избежать?

См. Пояснения для разъяснений.

class A{ 
    public A(){ 
     some time-consuming code; 
    } 
    public void methodInA(){ 
     some method in A; 
    } 
} 

class B{ 
    public B(){ 
     A a = new A(); 
     for (i=0; i<10000;i++) 
      methodInB(); 
    } 
    public void methodInB(){ 
     methodInA(); 
    } 
} 
//so far, everything is perfect, but I have another class C 

class C{ 
    public C(){ 
     some code; 
    } 
    public void methodInC(){ 
     for (i = 0; i<10000; i++) 
      new B(); 
    } 

} 
+0

Лично я бы поместил код в какой-то метод, который вы можете, это дает вам лучший контроль над тем, когда вы можете его назвать, но это я – MadProgrammer

+0

Спасибо, предположим, что я помещаю их в метод A, и мне нужно только вызывать их один раз (читать и обрабатывать данные для другого метода A), поскольку они требуют много времени, но мне нужно много раз вызывать метод B (требуется данные из метода A) в разных местах (классах), как мне избежать вызова метод A несколько раз[email protected] – 1a1a11a

+3

Имейте один класс, который загружает и обрабатывает данные, но возвращает результат данных, из которых вы можете перейти к другим классам/методам. Бит, как заводской шаблон – MadProgrammer

ответ

2

Подход 1: Сделать методы в статическом классе A и выполнить инициализацию в статическом блоке.

См. Это SO answer.

class A { 
    // if any variable then make them static 
    static { 
     // some time-consuming code; 
    } 

    public static void methodInA() { 
     // some method in A; 
    } 
} 

class B { 
    public B() { 
     for (int i = 0; i < 10000; i++) 
      methodInB(); 
    } 

    public void methodInB() { 
     A.methodInA(); // directly call static method 
    } 
} 

подход 2: Марка класса А singleton. Но это not recommended в этом SO answer от @BalusC.

+0

Спасибо за ваше предложение и пример, это очень полезно. – 1a1a11a

+1

Для парней, которые могут найти это полезное, также можно проверить http://stackoverflow.com/questions/335311/static-initializer-in-java, которые имеют некоторое объяснение статической части. – 1a1a11a

0

Итак, вы уже определили проблему сдачи, что «много времени кода fragement» в свой конструктор класса А. Если потребляя constructr время называют часто, так что если вы создаете много объектов из класс a, у вас будет общая трудоемкая программа. В вашем случае, например, метод

mehodInC(){ 
    //some code 
} 

класса С создадут 10000 новых B объектов, а так как каждый B Объект автоматически создает объект в конструкторе, вы бы в конечном итоге вызов трудоемкого фрагмента кода 10.000 раз.

Теперь это, очевидно, субоптимально, как мы можем это исправить? Если бы я был вами, я бы переместил этот фрагмент кода в метод, так как он дает вам больше контроля над тем, когда вы хотите его вызвать. (Позволяет называть этот метод methTimeConsuming() для дальнейшего аргумента) Он также разделяет различные функции вашей программы. Это поможет улучшить читаемость вашего окончательного кода.

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

A myObj = new A(); 
myObj.methTimeConsuming(); 
for(int x = 0; x < 9999; x++){ //9999 because you already called it once outside of for-loop 
    myObj = newA(); 
} 

Obvioulsly это очень простой фрагмент кода, но идея может быть расширена с там.

+0

Извините, когда вы вызываете новый цикл A() и используете его метод, инициализация все равно должна выполняться для каждого экземпляра A(). – 1a1a11a

+0

Мне очень жаль, наверное, я неправильно понял ваш вопрос. Я подумал, что вам нужно всего лишь раз называть фрагмент кода времени (после первой инициализации), а затем снова не повторять. Мой ответ тогда, очевидно, не поможет. Тогда статический, как объяснялось выше, является способом выхода. – Benjamin

+0

Вы правы. Я не очень четко изложил это, извините за мой pooooor English. Во всяком случае, я очень ценю вашу помощь. – 1a1a11a

Смежные вопросы