java中的帮助对象是什么?

时间:2010-01-25 21:27:30

标签: java

我遇到过几次被称为辅助对象的事情......任何人都可以详细说明这些辅助对象是什么,为什么我们需要它们呢?

6 个答案:

答案 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
  • 管理的classees

(上面的示例只是一个示例 - 不应该根据域驱动设计进行讨论)

答案 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);