将对象传递给 Java 中的不同库

Posted

技术标签:

【中文标题】将对象传递给 Java 中的不同库【英文标题】:Passing objects to different libraries in Java 【发布时间】:2015-01-31 20:15:18 【问题描述】:

这是一个关于将对象传递到不同库或项目的最佳实践的问题。

假设我们有一个名为 Student and Grades 的课程。

 import Grades; 

 public class Student ()
      String StudentName;
      String StudentID;
      int age;
      int gradeForMath;
      int gradeForScience;
      Grades otherGrades; 
 

现在在我们的主要课程中,我想将 Grades 课程和一些 Integers 传递到一个库中,以计算学生明年通过的可能性。

 public static void main ()
      MyExternalLibraryCalculatingPassRate passRate = new MyExternalLibraryCalculatingPassRate(Grades otherGrades, int math, int science); 
 

但是,我的问题是 Library 对 Grades 没有可见性,也没有一个名为 Grades 的类。我的问题真的是,这样做的最佳方法是什么?我有以下两个想法,但我不确定是否有更好或更坏的方法 -

    传递 Grades 的底层数据结构。例如,如果我们可以将成绩归结为哈希图或数组列表,或者通过什么来传递?

    在库中创建一个 Grades 类并将其导入到您的项目中,然后在您的项目中使用库中的 Grades 类而不在您的项目中声明 Grades 类?

我不相信这两种方法都很好 - 但是最佳做法是什么?还是经常做的?

【问题讨论】:

库的方法签名是什么?是否在签名中接受Grades @SajanChandran 你没抓住重点,图书馆是他/她的。顺便说一句,让 API 传递原始数据是个好主意。如果库需要的只是一个东西的哈希图,那么#1 是个好主意。 API 的分离似乎有点不寻常,因为您的代码和库都在同一个域上运行。但是,由于您希望将库完全分开,如果您可以明确定义键,则选项 1 会更好。最好的办法是从库中公开一个接口并实现(如下所示) 【参考方案1】:

您可以在外部库中定义一个接口,该接口指定必须如何组织数据,但不提供实现。 例如:

public class StudentPassRateData 
      int getGradeForMath();
      int getGradeForScience();

然后,在主项目中,你可以定义一个实现这个接口的类:

public class Student implements StudentPassRateData 
      private String StudentName;
      private String StudentID;
      private int age;
      private int gradeForMath;
      private int gradeForScience;
      private Grades otherGrades; 

      int getGradeForMath() return gradeForMath;
      int getGradeForScience() return gradeForScience;
 

【讨论】:

【参考方案2】:

看来您的库和主项目在同一个域上运行,所以我认为最好的办法是共享通用数据模型。如果MyExternalLibraryCalculatingPassRate 计算Student 会通过的概率,那么使用Student 对象的方法可能会更好,而不是Grades 和两个原语。一般来说,混合对象和原语来表示相同的概念是一个坏主意。

--更新

我发现此代码存在其他问题,Student 类只有字段。因此,如果其他班级想要获得成绩,他们应该知道成绩的内部表示(一个Grades 字段和两个ints),这通常是一件坏事。

【讨论】:

学生类只是一个例子,实际类中没有一些方法。另外我想保持图书馆分开,因为图书馆也可以用于其他事情? 可重用库是好东西,但在这种情况下MyExternalLibraryCalculatingPassRate 建议它从学校/班级域计算某种概率。您将如何在其他领域重用它?也许最好创建一个负责计算概率的库,这是相当普遍的事情,它不限于特定领域,可以被一些CalculatingPassRate类使用。那么就没有必要创建仅限于计算通过率概率的库了。 谢谢马尔辛。学生班只是一个例子,但在真正的班级中有一些方法。以及成绩和数学和科学标记,它们在此处作为单独的变量传递,以简化解释,但在实际情况下,它们在概念上是不同的值。 库应该是灵活的。从某种意义上说,在不同的项目/上下文/域中使用它们应该是可能的并且应该是有意义的。例如,对图进行操作的库知道什么是 Edge、Node 等,它知道如何计算节点之间的最短路径。这个库可以用于其他用于计划货物、公共交通等的应用程序,但首先开发人员必须提供从运输/货物域到顶点域的一些翻译,并且应该在应用程序中完成翻译. 是的,我认为这听起来很合理。这可能是我将采取的方法。

以上是关于将对象传递给 Java 中的不同库的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MVC 在将对象传递给视图时倾向于将对象转换为数组?

将对象传递给java中的方法似乎是通过引用(而Java是通过val)

检测何时将对象传递给 C++ 中的新线程?

Java/Android - 在资源打开的情况下将对象传递给方法

创建将对象传递给实例方法的 NSPredicate

如何使用核心数据将对象传递给 SwiftUI 中的其他视图