2013-05-24 3 views
5

У меня есть такая подпись метода.Эффективный параметр, проходящий в методе в java

public void calculateFinalInvoice(int a, int b, int c, int d, int e, int f, int g, int h, int i, InvoiceDO invoiceDO) { 
    // TO DO 

} 

Передаю некоторые параметры. Так что лучше передать все эти параметры производительности. Или 1) поддерживать класс для всех этих параметров 2) поддерживать HashMap для всех этих параметров 3) для этого необходимо использовать ArrayList.

Можете ли вы предложить, какой из них лучше достичь производительности.

+0

Всегда 'а к i' число параметров? –

+0

как часто это называется? – waldol1

+9

Используйте класс для обслуживания кода. Не беспокойтесь о производительности, если вам не нужно. –

ответ

2

Какую версию Java вы используете? Что вы делаете с этими параметрами. Вы могли бы быть лучше перемещая DAO к передней части списка аргументов, а затем с помощью varargs пройти однако многие int сек вы хотите:

calculateFinalInvoice(InvoiceDO invoiceDO, int args...) { 
} 
+0

Я использую java 1.6 – John

+0

В коде есть опечатка. Он должен быть вычислятьFinalInvoice (InvoiceDO invoiceDO, int ... args) {} –

0

вы можете просто передать массив Int

calculateFinalInvoice(int[] values, InvoiceDO invoiceDO) { } 
+0

Любые, как я хочу, чтобы мой уровень сервиса – John

+0

@sorry не достал вас .. есть ли проблема с передачей массива int? – stinepike

+0

да, это также возможно. может ли производительность быть эффективной? – John

1

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

public void calcualteFinalInvoices(int [] invoices, InvoiceDO action){ 
    //... 
} 
0

Забудьте о производительности. Это не проблема. Проблема заключается в том, что точно так же, как формула для инженера не должна превышать 1 дюйм, метод не должен содержать более трех аргументов. Если вам нужно больше, измените свой дизайн.

Возможно, вам необходимо создать специальный класс параметров и передать его экземпляр методу. Или поместите метод в другой класс, который хранит некоторые данные в виде полей экземпляров ...

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

+0

Глупые правила глупы. Может быть возможно найти кластеры связанных параметров и передать их в виде объектов. Тем не менее, любое создание такого объекта обязательно будет медленнее, чем просто передать параметры. –

+0

Спасибо вам. – John

+1

Дорогой @Bob Dalgleish, глупые правила помогают. Вам нравится метод, который принимает 10 аргументов? Удобны ли они? Легко ли они использовать? Думать об этом. – AlexR

1

Я бы осмелился дать вам более ООП, более читаемый подход.

Ваш образец кода сродни вызову trim("my string") вместо "my string".trim(). Это процедурное программирование, в котором код работает с пассивными данными (trim, работающий на "my string"). В ООП мы вместо этого отправляем сообщения на объекты для выполнения запросов, например, в "my string".trim()".

Таким образом, альтернатива идентифицирует Invoice как концепцию, которая может быть запрошена для ее значения или содержания. Затем мы используем method chaining и encapsulation, чтобы получить наиболее читаемую и удобную для пользователя программу. Если разные переменные имеют особые значения, вы можете украсить класс Invoice со специальными версиями add, например addBalance и так далее.

class Invoice { 
    private final List<Integer> values = new ArrayList<Integer>(); 

    public Invoice add(int value) { 
     values.add(value); 
     return this; 
    } 

    public double value() { 
     // Use the values to compute the final invoice. 
     return computedFinalInvoice; 
    } 
} 

Использование так:

double finalInvoiceValue = new Invoice() 
    .add(1) 
    .add(2) 
    .add(100) 
    .value(); 
Смежные вопросы