Что такое вспомогательные объекты в Java? - PullRequest
34 голосов
/ 26 января 2010

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

Ответы [ 6 ]

50 голосов
/ 26 января 2010

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

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

(приведенный выше пример является лишь примером - его не следует обсуждать с точки зрения доменного управления)

12 голосов
/ 26 января 2010

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

Например, у многих людей есть вспомогательный объект 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);

вместо этого. Например, посмотрите на гуаву closeQuietly .

1 голос
/ 26 января 2010

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

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

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

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

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

0 голосов
/ 19 декабря 2018

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

public final class HelperClass{

       private HelperClass(){
       }

       public static boolean isPositive(int number) {

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

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

 HelperClass.isPositive(5);
0 голосов
/ 03 февраля 2015
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 ("input your number");

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

0 голосов
/ 16 мая 2013

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

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