Java中的服务类是否可以包含状态或成员字段?

Java中的服务类是否可以包含状态或成员字段?,java,oop,design-patterns,Java,Oop,Design Patterns,我有几个计算器类,可以为用户计算一些东西 @Getter @Setter public class Input{ private Info info; private ResultAlpha resultAlpha; private ResultBeta resultBeta; private ResultGamma resultGamma; private ResultPsi resultPsi; private ResultLambda re

我有几个计算器类,可以为用户计算一些东西

@Getter
@Setter
public class Input{

    private Info info;
    private ResultAlpha resultAlpha;
    private ResultBeta resultBeta;
    private ResultGamma resultGamma;
    private ResultPsi resultPsi;
    private ResultLambda resultLambda;
    private ResultAph resultAph;

}
我不想将所有变量传递给calculate方法,所以我在calculator类中保存了输入类中所有字段的引用。这有助于避免在每个计算函数中发送所有参数。但每次我为新用户调用CalculationService时,我都必须为它创建一个新对象,否则它将不会是线程安全的

我的另一个选择是以下方法-

public final class CalculationService(){


    private CalculationService(){
    
    }

    public static void calculate(Input input){
   

        Info info = input.getInfo();
        ResultAlpha resultAlpha = input.getResultAlpha();
        ResultBeta resultBeta =input.getResultBeta();
        ResultGamma resultGamma=input.getResultGamma();
        ResultAph resultAph = input.getResultAph();
        ResultLambda resultLambda =input.getResultLambda();
        ResultPsi resultPsi = input.getResultPsi();

        calculate1(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);
        calculate2(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);
        calculate3(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);
        calculate4(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);
        calculate5(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);
        calculate6(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);

    }

    private static void calculate1(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

    private static void calculate2(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

    private static void calculate3(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

    private static void calculate4(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

    private static void calculate5(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

    private static void calculate6(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

}
这不需要创建CalculationService类的对象实例

我的主要问题是,由于输入类是一个嵌套很深的对象,所以在尝试使用输入类中的数据时,我希望避免使用很多getter函数。这就是我试图将输入对象分解为其成员字段的主要原因。否则,我的计算函数将有长的getter调用,如

input.getResultAlpha().getObj2().getObj3().getObj4().setData(1234);
那么,像我在第一种方法中所做的那样在服务类中保存状态可以吗?

在面向对象编程中,助手类用于帮助提供某些功能,这不是使用它的应用程序或类的主要目标。助手类的实例称为助手对象(例如,在委托模式中)

实用类是helper类的特例,其中的方法都是静态的。通常,帮助器类不必具有所有静态方法,但可以具有实例变量。助手类的多个实例也可能存在

如您所见,helper类不仅仅是静态方法的类,它们还可以是带有实例字段和实例方法的常规POJO类

因此,不要静态地使用它,而是使用一个实例:

//静态帮助程序
CalculationHelper.Calculation(输入);
//实例助手
CalculationHelper=新的CalculationHelper(输入);
helper.calculate();
正如上面所说:

在面向对象编程中,助手类用于帮助提供某些功能,这不是使用它的应用程序或类的主要目标。助手类的实例称为助手对象(例如,在委托模式中)

实用类是helper类的特例,其中的方法都是静态的。通常,帮助器类不必具有所有静态方法,但可以具有实例变量。助手类的多个实例也可能存在

如您所见,helper类不仅仅是静态方法的类,它们还可以是带有实例字段和实例方法的常规POJO类

因此,不要静态地使用它,而是使用一个实例:

//静态帮助程序
CalculationHelper.Calculation(输入);
//实例助手
CalculationHelper=新的CalculationHelper(输入);
helper.calculate();

将此类类称为“Helper”不是一种好做法。通常,助手只保存静态方法(例如)。你更可能有一个概念上的问题,我称之为“服务”,但不管怎样。当然没关系——基于需求等最有意义的东西。我看不出分解输入对象有多大意义,除非它真的有助于保持事物的整洁。@ggr所以我们假设它不是一个助手类。采用第一种方法可以吗?我们首先得初始化这个类case@ggr这将是一个实用程序类,因此命名为StringUtils。术语helper类是一个超集,它还包括带有实例字段的类。@DaveNewton“Service”的含义与多层体系结构的“Service”层不同,也就是说,将此类类称为“Service”类而不是“helper”类,实际上是混淆了术语。将此类类称为“助手”不是一个好的做法。通常,助手只保存静态方法(例如)。你更可能有一个概念上的问题,我称之为“服务”,但不管怎样。当然没关系——基于需求等最有意义的东西。我看不出分解输入对象有多大意义,除非它真的有助于保持事物的整洁。@ggr所以我们假设它不是一个助手类。采用第一种方法可以吗?我们首先得初始化这个类case@ggr这将是一个实用程序类,因此命名为StringUtils。术语helper类是一个超集,它还包括带有实例字段的类。@DaveNewton“Service”的含义与多层体系结构的“Service”层不同,也就是说,将此类类称为“Service”类而不是“helper”类,我主要关心的是,这个对象是为每个用户请求创建的,创建一个实例帮助器或者尝试将我的类结构更改为静态帮助器可以吗。为每一个请求创建新对象会是一种代码气味还是令人不快?因为我在春季看到的大多数服务类都是单例的bean@Abhinav为每个请求创建一个新对象没有错。您没有向我们展示
Info
Result*
类的代码,但假设这些类只是POJO,JVM在创建和垃圾收集小对象方面非常有效。@Abhinav为什么为每个请求创建一个实例都是代码气味?如果需要跟踪有关请求的额外信息,例如在方法调用和/或“层”之间传递,则需要一个实例来存储该信息,特别是如果方法可以添加有关请求的更多数据时。@DavidConrad实际上这些信息和结果类非常庞大,因为它们是DTO类。但是信息和结果类的大小对JVM真的很重要吗,因为我只在这里存储引用?@Abhinav-ground和DTO对我来说听起来很奇怪,DTO在我的系统中通常都不是很大的
public final class CalculationService(){


    private CalculationService(){
    
    }

    public static void calculate(Input input){
   

        Info info = input.getInfo();
        ResultAlpha resultAlpha = input.getResultAlpha();
        ResultBeta resultBeta =input.getResultBeta();
        ResultGamma resultGamma=input.getResultGamma();
        ResultAph resultAph = input.getResultAph();
        ResultLambda resultLambda =input.getResultLambda();
        ResultPsi resultPsi = input.getResultPsi();

        calculate1(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);
        calculate2(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);
        calculate3(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);
        calculate4(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);
        calculate5(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);
        calculate6(info, resultAlpha, resultBeta, resultGamma, resultAph, resultLambda, resultPsi);

    }

    private static void calculate1(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

    private static void calculate2(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

    private static void calculate3(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

    private static void calculate4(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

    private static void calculate5(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

    private static void calculate6(Info, ResultAlpha, ResultBeta, ResultGamma, ResultAph, ResultLambda, ResultPsi){

    }

}
input.getResultAlpha().getObj2().getObj3().getObj4().setData(1234);