我遇到过几次被称为辅助对象的事情......任何人都可以详细说明这些辅助对象是什么,为什么我们需要它们呢?
答案 0 :(得分:50)
一些类共有的一些操作可以移动到辅助类,然后通过对象组合使用它们:
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
(上面的示例只是一个示例 - 不应该根据域驱动设计进行讨论)
答案 1 :(得分:12)
这些是“坐在代码主体侧面”的对象,并为对象做一些工作。他们“帮助”对象完成它的工作。
例如,很多人都有一个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。
答案 2 :(得分:1)
'帮助'方法通常是一种使更容易的方法,无论它是什么。有时它们会被用来使事物更具可读性/组织清晰(有些人可能会争论这一点,但这最终是非常主观的):
public void doStuff() {
wakeUp();
drinkCoffee();
drive();
work();
goHome();
}
其中,每个'辅助方法'本身都相当复杂......概念变得非常简单明了。
辅助方法的另一个很好的用途是在许多不同的类中提供通用功能。最好的例子是Math
类,它包含大量静态辅助方法,可以帮助您计算数字的对数,数字的指数等等。
在哪里绘制关于什么是辅助方法的线,什么只是常规方法是非常主观的,但这是它的要点。这里的其他答案也很不错。
答案 3 :(得分:0)
在我看来,Helper类与在C ++中的类外声明的普通函数类似。例如,如果您需要许多类的全局常量,那么您可以定义一个包含最终静态const变量的辅助类。
答案 4 :(得分:0)
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;
}
}
这是助手类的一个例子。它包含项目中其他类的常用方法。
示例如果有人想从类中输入一个Integer数,则必须输入:String num = Helpers.getIntegerInput(“输入你的数字”);
提示符是向用户显示的输出。输入字符串,双精度,日期和时间等的其他示例。
答案 5 :(得分:0)
您可以看到一个帮助程序类作为工具箱,其他类可以使用它来执行诸如测试字符串是否为回文,给定数是否为质数,数组是否包含负数等测试任务。您可以创建帮助程序类,可以将其所有方法设为静态,并将其构造函数设为私有,也可以选择使类为final。因此,它无法实例化,并且可以轻松地直接访问其所有方法。
public final class HelperClass{
private HelperClass(){
}
public static boolean isPositive(int number) {
if (number >= 0)
return true;
else
return false;
}
}
此功能可直接用于测试数字:
HelperClass.isPositive(5);