Я сталкиваюсь с несколькими моментами, называемыми вспомогательными объектами... может ли кто-нибудь уточнить, что это за вспомогательные объекты и зачем они нам нужны?
Что такое вспомогательные объекты в java?
Ответ 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
, а классы, которые, в свою очередь, имеют зависимости/должны управляться контейнером DIXHelper
(Пример выше - это всего лишь образец - его не следует обсуждать в терминах 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);