将对象传递给 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 中的不同库的主要内容,如果未能解决你的问题,请参考以下文章
将对象传递给java中的方法似乎是通过引用(而Java是通过val)