【问题标题】:Variable typing strategies (hiding vs inheriting abstract generic class vs instantiating generic class)变量类型策略(隐藏 vs 继承抽象泛型类 vs 实例化泛型类)
【发布时间】:2020-12-10 16:32:43
【问题描述】:

我无法在以下设计之间进行选择,因为我不知道它们在允许同一属性使用不同类型时有什么区别:

  1. abstract class A<T extend G> {T:t}
    class BT1 extend A<T1> {}
    这将继承抽象泛型类
  2. abstract class A {G:t}
    class BT1 extend A {T1:t}
    Thisd 将是变量隐藏
  3. class A<T extend G> {T:t}
    然后这个类将被实例化如下:new class A<T1>

  • 这三种设计有什么区别?
  • JPA 能否为案例 3 检索具有特定类型变量的实体?
  • JPA 如何处理泛型和继承的混合?

【问题讨论】:

  • 不清楚(对我来说,无论如何)在这种情况下您所说的“模板”是什么。请您详细说明“模板”的含义吗? TIA。
  • 已编辑 -> 我的意思是泛型类
  • 我的意思是泛型类“——第一,帮自己一个忙。不要将 Java 的参数多态性视为“C++ 模板”。只是表面上的相似。更重要的是,当您说:“我有一些困难要在以下设计之间进行选择时,更好地了解您的“困难”对我来说很有价值”。拜托,您能否编辑您的问题以详细说明那些“困难”?请分享一些您已经尝试过的示例代码,这些示例代码暴露了不同的“困难”? TIA。
  • 感谢您的编辑 :) — „3。 class A<T extend G> {T:t}...这将是泛型类实例化“ -​​ (JLS) 正确的术语是:Generic class declaration。当您实例化一个泛型类时,您所获得的 JLS 术语是“parameterized type”。您的代码示例不包含特定参数化类型的任何实例化。只有声明
  • 已编辑,第三类要实例化

标签: java templates jpa generics inheritance


【解决方案1】:
  • 这三种设计有什么区别?...

TL;DR

  • 设计#1 是“面向未来的”;它“开放扩展
  • Design #2 - 正如你所写的 - 将无法编译,因为 BT1{T1:t}NOT AN A {G:t}
  • 设计 #3 具有 #1 的“优点”之一;它也是“面向未来的”。 #3 的“con”虽然是一个具体的类

这是基于this experiment I did 以使您的问题的这一部分对我自己来说不那么抽象/更具体


长答案

这是一个 - 当给定多个设计时,选择“最佳设计 em>”取决于您的选择是否正确 em> 实现您打算它服务的任何目的。

您的第二个问题(关于 JPA)意味着您的意图可能是:“我想将我的应用程序的数据层与 ORM 框架集成“。

  • JPA 能否为案例 3 检索具有特定类型变量的实体?

我对此表示怀疑。如果您考虑一下,这实际上是 ORM 无法管理的。比如说,你注释了这样一个类,比如……

@Entity
@Table( name = "IMPOSSIBLES" )
public class A <T extends G > { 
    …
    @Column( name = "CHANGEABLE" )*/    
    private T t;
    …
    public T getT( ){ return t; }
    
    public void setT( T t ){ this.t = t; } 
    …
}

假设您的应用程序实例化了以下三种不同的参数化类型的A&lt; T extends G &gt;,例如……

  1. A&lt; String &gt; aStringNTT = new A&lt; &gt;( … )
  2. A&lt; Long &gt; aLongNTT = new A&lt; &gt;( … )
  3. A&lt; Date &gt; aDateNTT = new A&lt; &gt;( … )

那么您(或 JPA/Hibernate)必须编写的 DDL 才能将上述内容持久化到 IMPOSSIBLES 表中喜欢……

CREATE TABLE IMPOSSIBLES … ( CHANGEABLE VARCHAR(255) OR NUMBER OR DATE OR … , … )

不存在用于定义具有动态变化数据类型的数据库表列的此类语法。无论如何,在我所知道的任何 SQL 实现中都没有。

  • JPA 如何处理泛型和继承的混合?

根据我的经验,它处理得非常好。我几个月前实现了这个……

import javax.persistence.*;    
import org.springframework.data.domain.Persistable;

@MappedSuperclass
public abstract class AbstractPersistableCustom<PK extends Serializable> implements Persistable<Long> {

        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;

        /*
         * (non-Javadoc)
         * 
         * @see org.springframework.data.domain.Persistable#getId()
         */
        @Override
        public Long getId() {
            return id;
        }

        protected void setId(final Long id) {
            this.id = id;
        }
        …
}

...JPA 成功处理了持久化这个和其他几个具体的@Entitys...

@Entity
@Table(name = "survey_says")
public class Question extends AbstractPersistableCustom<Long> {

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "survey_id")
    private Survey survey;

    @OneToMany(mappedBy = "question", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @OrderBy("sequenceNo")
    private List<Response> responses;    
    …
}

【讨论】:

  • 非常感谢您的详细回答,我会研究它
  • 非常感谢您的详细回答...“ -​​ 欢迎您 @AlixHumbert :) 如果您不这样做'没有时间对上述答案中的任何其他内容做出回应,请至少对此做出回应:“请使用显示您已经尝试过的代码来编辑您的问题” . TIA。
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 2023-04-03
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2018-09-27
  • 2015-09-15
  • 1970-01-01
相关资源
最近更新 更多