如何使用接口引用保护匿名类创建

问题描述 投票:0回答:2

考虑业务场景:

我们有

student
payFees()
方法的接口。有一些类实现了学生接口并实现了
payFees
方法。它们是:
SchoolStudent
CollegeStudent
UniversityStudent
OnlineStudent

现在,开发人员将创建学生列表为

List<Student>
并将不同的学生添加到列表中(
SchoolStudent
CollegeStudent
等)。 现在开发人员可以使用
Student
接口创建匿名类,实现一些错误的
payFees
方法并将该对象添加到学生列表中。 这个匿名学生是无效的,它会扰乱业务逻辑。

那么我们将如何保护开发人员免于创建

Student
接口的匿名类。

java interface anonymous-class
2个回答
3
投票

我能想到的一种方法是(假设

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;
    }
}

0
投票

您可以不使用

Student
接口,而是使用带有包访问构造函数的类
Student

© www.soinside.com 2019 - 2024. All rights reserved.