考虑业务场景:
我们有
student
与 payFees()
方法的接口。有一些类实现了学生接口并实现了 payFees
方法。它们是:SchoolStudent
、CollegeStudent
、UniversityStudent
、OnlineStudent
。
现在,开发人员将创建学生列表为
List<Student>
并将不同的学生添加到列表中(SchoolStudent
、CollegeStudent
等)。
现在开发人员可以使用 Student
接口创建匿名类,实现一些错误的 payFees
方法并将该对象添加到学生列表中。
这个匿名学生是无效的,它会扰乱业务逻辑。
那么我们将如何保护开发人员免于创建
Student
接口的匿名类。
我能想到的一种方法是(假设
Student
接口的所有有效实现都在同一个包中)定义一个包私有附加接口(我们称之为ValidStudent
),除了实现之外,有效实现还实现该接口Student
。该包私有接口不必包含任何方法。
然后,您可以使用一些代码来验证添加到
Student
的 List
实例 - 该验证代码将检查这些实例是否也实现 ValidStudent
接口。 Student
的任何自定义实现都不会通过该验证。
package x;
public interface Student
{
...
}
package x;
interface ValidStudent // package private
{
// nothing here
}
package x;
public class SchoolStudent implements Student, ValidStudent
{
}
还有一个验证示例(验证可以由包
x
中对 Student
实例执行某些操作的任何类来完成):
package x;
public class StudentValidator
{
public static boolean isValid (Student student)
{
return student instanceof ValidStudent;
}
}
您可以不使用
Student
接口,而是使用带有包访问构造函数的类 Student
。