Подтвердить что ты не робот

Что такое вспомогательные объекты в java?

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

4b9b3361

Ответ 1

Некоторые операции, которые являются общими для нескольких классов, могут быть перенесены на вспомогательные классы, которые затем используются с помощью композиции объекта:

public class OrderService {
    private PriceHelper priceHelper = new PriceHelper();

    public double calculateOrderPrice(order) {
        double price = 0;
        for (Item item : order.getItems()) {
            double += priceHelper.calculatePrice(item.getProduct());
        }
    }
}

public class ProductService {
    private PriceHelper priceHelper = new PriceHelper();

    public double getProductPrice(Product product) {
        return priceHelper.calculatePrice(product);
    }
}

Использование вспомогательных классов может выполняться несколькими способами:

  • Выполнение их непосредственно (как указано выше)
  • через инъекцию зависимостей
  • создав свои методы static и получив доступ к ним статическим способом, например, IOUtils.closeQuietly(inputStream) закрывает исключения InputStream, исключающие исключение.
  • по крайней мере мое соглашение состоит в том, чтобы называть классы только статическими методами, а не зависимостями XUtils, а классы, которые, в свою очередь, имеют зависимости/должны управляться контейнером DI XHelper

(Пример выше - это всего лишь образец - его не следует обсуждать в терминах Driven Design)

Ответ 2

Это объекты, которые "сидят в стороне" от основной части кода и выполняют часть работы для объекта. Они "помогают" объекту выполнять работу.

Например, у многих людей есть вспомогательный объект Closer. Это будет принимать различные закрываемые объекты, например, java.sql.Statement, java.sql.Connection и т.д., И будет закрывать объект и игнорировать любые ошибки, которые из него выходят. Это происходит потому, что если вы получаете ошибку при закрытии объекта, вы ничего не можете с этим поделать, так что люди просто игнорируют это.

Вместо того, чтобы иметь этот шаблон:

try {
  connection.close();
} catch (SQLException e) {
  // just ignore… what can you do when you can't close the connection?
   log.warn("couldn't close connection", e);
}

разбросанные по кодовой базе, они просто вызывают:

Closer.close(connection);

вместо. Например, посмотрите на guava closeQuietly.

Ответ 3

Метод "помощник" обычно является способом сделать что-то более легким, каким бы оно ни было. Иногда они используются, чтобы сделать вещи более читаемыми/четко организованными (некоторые могут спорить об этом, но в конечном итоге очень субъективны):

public void doStuff() {
   wakeUp();
   drinkCoffee();
   drive();
   work();
   goHome();
}

Где каждый "вспомогательный метод" сам по себе довольно сложный... концепция становится очень ясной и простой.

Еще одно очень хорошее использование вспомогательных методов - обеспечить общую функциональность во многих разных классах. Лучшим примером этого является класс Math, который содержит тонну статических вспомогательных методов, которые помогут вам рассчитать такие вещи, как журнал числа, показатель числа... и т.д.

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

Ответ 4

Класс помощника, на мой взгляд, похож на обычные функции, объявленные вне классов в С++. Например, если вам нужна глобальная константа для многих классов, то вы можете определить вспомогательный класс, который включает конечную статическую константную переменную.

Ответ 5

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class Helpers {
public static String getDate() {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
        return dateFormat.format(new Date());
    }

    public static boolean isTimeABeforeTimeB(String timeA, String timeB) {
        try {
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm aa");
            Date dA = dateFormat.parse(timeA);
            Date dB = dateFormat.parse(timeB);
            if (dA.getTime() < dB.getTime()) {
                return true;
            } else {
                return false;
            }
        } catch (Exception e) {
            //
        }
        return false;
    }

    public static String getDateAndTimeInput(String prompt) {
        Scanner input = new Scanner(System.in);
        String ans;
        SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy hh:mm aa");
        dateFormat.setLenient(false);
        boolean dateValid;
        do {
            System.out.print(prompt);
            ans = input.nextLine();
            ans = ans.trim();
            dateValid = true;
            try {
                Date d = dateFormat.parse(ans);
            } catch (Exception e) {
                dateValid = false;
            }
        } while (!dateValid);
        return ans;
    }


    public static String getStringInput(String prompt) {
        Scanner input = new Scanner(System.in);
        String ans;

        do {
            System.out.print(prompt);
            ans = input.nextLine();
            ans = ans.trim();
        } while (ans.length() == 0);
        return ans;
    }

    public static double getDoubleInput(String prompt) {
        Scanner input = new Scanner(System.in);
        double ans = 0;
        boolean inputValid;
        do {
            System.out.print(prompt);
            String s = input.nextLine();
            //Convert string input to integer
            try {
                ans = Double.parseDouble(s);
                inputValid = true;
            } catch (Exception e) {
                 inputValid = false;
            }
        } while (!inputValid);
        return ans;
    }

    public static int getIntegerInput(String prompt) {
        Scanner input = new Scanner(System.in);
        int ans = 0;
        boolean inputValid;
        do {
            System.out.print(prompt);
            String s = input.nextLine();
            // Convert string input to integer
            try {
                ans = Integer.parseInt(s);
                inputValid = true;
            } catch (Exception e) {
                inputValid = false;
            }
        } while (!inputValid);
        return ans;
    }

    public static int getIntegerInput(String prompt, int lowerBound, int upperBound) {
        Scanner input = new Scanner(System.in);
        int ans = 0;
        boolean inputValid;
        do {
            System.out.print(prompt);
            String s = input.nextLine();
            // Convert string input to integer
            try {
                ans = Integer.parseInt(s);
                if (ans >= lowerBound && ans <= upperBound) {
                    inputValid = true;
                } else {
                     inputValid = false;
                }
            } catch (Exception e) {
                inputValid = false;
            }
       } while (!inputValid);
       return ans;
   }
}

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

Пример, если кто-то хочет ввести целое число из класса, которому нужно вводить следующее: String num = Helpers.getIntegerInput( "введите свой номер" );

Приглашение - это вывод, который отображается пользователю. Другие примеры ввода строки, двойной, даты и времени и т.д.

Ответ 6

Вы можете видеть вспомогательный класс как набор инструментов, который может использоваться другими классами для выполнения таких задач, как тестирование, если строка является палиндромом, если заданное число простое, массив содержит отрицательное число и т.д. Вы можете создать вспомогательный класс, выполнив все его методы static и его конструктор private, и вы также можете сделать класс final. Таким образом, он не может быть создан, и можно легко получить доступ ко всем его методам напрямую.

public final class HelperClass{

       private HelperClass(){
       }

       public static boolean isPositive(int number) {

             if (number >= 0) 
                    return true;
             else
                    return false;
       }
}

Здесь функцию можно использовать непосредственно для проверки числа:

 HelperClass.isPositive(5);