Java Hibernate Spring - 具有默认实现的服务接口

我有一个使用 hibernate 的 Java 数据库应用程序,其中不同的类具有相同的属性(此处:“active”)。在接口中,有一个函数可以根据这样的属性(活动)从数据库中检索条目。到目前为止,我正在这样做:

//interface

public interface ObjSvcIntf {

   default <Entity> ArrayList<Entity> get(Boolean active);

}

//implementation 1

public class ObjCarSvc implements ObjSvcIntf {


   @SuppressWarnings("unchecked")

   @Override

   public ArrayList< ObjCar > get(Boolean active) {

       @SuppressWarnings("rawtypes")

       Query query = DB.s.createQuery("from " + ObjCar.class.getSimpleName() + " where active = :active");

       query.setParameter("active", active);


       if (!query.list().isEmpty()) {

           return (ArrayList< ObjCar >) query.list();  

       } else {

           return null;

       }



   }


//implementation 1

public class ObjPersonSvc implements ObjSvcIntf {


   @SuppressWarnings("unchecked")

   @Override

   public ArrayList< ObjPerson > get(Boolean active) {

       @SuppressWarnings("rawtypes")

       Query query = DB.s.createQuery("from " + ObjPerson.class.getSimpleName() + " where active = :active");

       query.setParameter("active ", active);


       if (!query.list().isEmpty()) {

           return (ArrayList< ObjPerson >) query.list();   

       } else {

           return null;

       }



   }

正如您所看到的,每个实现类中都有很多冗余代码,我想避免这种情况。因此,我想要的是在接口中拥有一个通用的默认函数,该函数将为接口的每个实现返回相同的值(当然,除非被实现类覆盖)。即,类似这样的东西(当然,这不起作用):


public interface ObjSvcIntf {


   default <Entity> ArrayList<Entity> get(Boolean active) {

       @SuppressWarnings("rawtypes")

       Query query = DB.s.createQuery("from " + Entity.class.getSimpleName() + " where active = :active");

       query.setParameter("active", active);


       return (ArrayList<Entity>) query.list();

   }


}

我在这里缺乏正确的理解,如何以正确的方式在接口中创建函数,以便能够在不同的上下文/不同的类中使用它。


我该如何调整界面中的功能来实现这一点?


当年话下
浏览 129回答 3
3回答

蓝山帝景

您可以创建一个抽象函数来返回子类的对象。像这样的东西会起作用。这是示例代码,其中接口返回作为实现该接口的类的对象列表。public interface ObjSvcIntf<E> {&nbsp; &nbsp; default List<E> get(Boolean active) {&nbsp; &nbsp; &nbsp; &nbsp; var list = new ArrayList<E>();&nbsp; &nbsp; &nbsp; &nbsp; list.add(self());&nbsp; &nbsp; &nbsp; &nbsp; return list;&nbsp; &nbsp; }&nbsp; &nbsp; E self(); // function to return the sub class instance}

12345678_0001

我重组了该项目,将接口与其实现分开。现在,扩展接口的(抽象)实现的每个类在调用超级构造函数时都会设置类型“Class”的属性,抽象类中的每个函数都引用该属性。有没有更好的办法?这种方法有哪些潜在问题?界面:public interfaceObjSvcIntf {&nbsp; &nbsp; <Entity> Object getById(Long id);}实现抽象类:public abstract class ObjSvcImpl implements ObjSvcIntf {&nbsp; &nbsp; public Class<?> servicedClass;&nbsp; &nbsp; // CONSTRUCTOR&nbsp; &nbsp; public ObjSvcImpl(Class<?> servicedClass) {&nbsp; &nbsp; &nbsp; &nbsp; this.servicedClass = servicedClass;&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; public <Entity> Object getById(Long id) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return DB.getById(this.servicedClass, id);&nbsp; &nbsp; }}服务等级:public class ObjCarSvc extends ObjSvcImpl {&nbsp; &nbsp; public ObjCarSvc() {&nbsp; &nbsp; &nbsp; &nbsp; super(ObjCar.class);&nbsp; &nbsp; }}型号类别:@Entity@Table(name = "OBJ_CAR")public class ObjCar implements Serializable {&nbsp; &nbsp; private static final long serialVersionUID = 1L;&nbsp; &nbsp; @Id&nbsp; &nbsp; @GeneratedValue(strategy = GenerationType.IDENTITY)&nbsp; &nbsp; @Column(name = "OBJ_CAR_ID")&nbsp; &nbsp; private Long objCarId;&nbsp; &nbsp; @NotNull&nbsp; &nbsp; @Column(name = "NAME")&nbsp; &nbsp; private String name;&nbsp; &nbsp; // Getters and Setters}

呼啦一阵风

public interface ObjSvcIntf<Entity> {&nbsp; &nbsp; default <Entity> ArrayList<Entity> get(Boolean active) {&nbsp; &nbsp; &nbsp; &nbsp; @SuppressWarnings("rawtypes")&nbsp; &nbsp; &nbsp; &nbsp; Query query = DB.s.createQuery("from " + getImplClass().getSimpleName() + " where active = :active");&nbsp; &nbsp; &nbsp; &nbsp; query.setParameter("active", active);&nbsp; &nbsp; &nbsp; &nbsp; return (ArrayList<Entity>) query.list();&nbsp; &nbsp; }&nbsp; &nbsp; Class getImplClass();}您可以为每个实现提供与为泛型类型提供的相同的类。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java