java - 从单个对象继承的不同类型的集合与单个 super 对象的集合

标签 java ibatis

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

5年前关闭。




Improve this question




想象以下场景。

class Shape
{
    // methods of Class Shape
}

class Circle extends Shape
{
   // methods of Class Shape
   // methods of Class Circle 
}

class Square extends Shape
{
  // methods of Class Shape
  // methods of Class Square 
}

class Canvas  // This class should a bucket of objects that belong to Square and Circle 
{
  // Declaring a single list of supertype
  List<Shape> heterogeneousCollection;

  // Declaring two separate lists
  List<Cirlce> homogeneousCollection;
  List<Square> homogeneousCollection; 
}

对应的关系模式如下
  • 表格形状包含主信息
  • 表格 Circle 和 Square 通过外键引用的方式丰富 Shape 中的数据(Circle 和 - Square 是具有不同列的不相交集)
  • 表格 Canvas 是一种数据聚合
  • Canvas 加入圈子(1..n 基数)
  • Canvas 加入 Square (1..n 基数)

  • 哪个是更好的方法“声明一个父类(super class)型列表(异构集合)”或“声明两个单独的列表(两个不同的同质集合)”

    我在做决定时考虑了以下几点。
  • 从数据库读取时,我们如何填充对象 Canvas?

  • 考虑一种避免 N+1 问题并从单个查询中读取的方法,例如
    SELECT * FROM 
    Canvas INNER JOIN Circle ON ..  
    Canvas INNER JOIN Square ON ..  
    Circle INNER JOIN Shape ON ..  
    Square INNER JOIN Shape ON ..   
    

    现在,对于 Canvas 的每一条记录,我们都以 (B+C) 行结束。但是,使用几个 ORM 工具,可以将 Circle 和 Square 中的不同数据集分组到两个单独的列表中。 (我在这里考虑iBatis)
  • 我们如何处理这些对象上的几个函数?
    想象一个我们计划处理 UI 函数以在对象 Canvas 中显示数据的案例。除了Circle和Square之间的共同功能外,它们中的每一个都可以具有不同的功能。例如 Square 可以有 getLengthOfSide(),而 Circle 可以有 getRadius()。如果我们使用异构列表,我们最终可能会在需要访问这些函数的每个地方都使用强制转换运算符。
    Class Canvas  
    {  
        void drawAll()  
        {  
            for (Shape s : heterogeneousCollection)  
            {  
                if (s instanceof Circle)  
                {  
                    s.draw(); // common function present in Shape also  
                    s.xyz(); //  specific to Circle  
                }  
                if (s instanceof Square)  
                {  
                    s.draw(); // common function present in Shape also  
                    s.abc(); //  specific to Square  
                }  
            }   
        }  
    }  
    

  • 在两个同构列表的情况下,我们可能分别为每个列表有两个不同的 for 循环。

    但是,如果我们需要添加一种新的形状(比如三角形),它会影响 Canvas,我觉得这是设计缺陷的结果,Java 可能有能力处理这个问题。请对此有所了解。任何对书籍/链接的引用都会有很大帮助。只是想告诉你们,这不是学校作业,我正在认真研究各种解决方案。请原谅我问了一个很长的问题。

    PS:另一种解决方案List<? extends Shape>被排除,因为我们无法将任何对象插入此集合。

    最佳答案

    当我们有一般信息而不是具体事实时,很难给出解决方案。例如 xyz() 和 abc() 方法。它们是什么,为什么?在您的示例中,它们似乎有类似的用途,因此我会考虑在 Shape 中定义一个名为 doSomethingSpecific() 的抽象方法,以便由所有 Shape 子类实现。
    现在你的代码是:

       void drawAll()  
           {  
           for (Shape s : heterogeneousCollection)  
               {
               s.draw();                // common function present in Shape also  
               s.doSomethingSpecific(); //  specific to each implementation  
               }   
           }  
    

    如果可能,我更喜欢异构集合。我非常不喜欢instanceof由于您指出的原因 - 当我们添加 Triangle 时会发生什么混合。

    关于java - 从单个对象继承的不同类型的集合与单个 super 对象的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3943915/

    相关文章:

    java - 替换 HTML 文件中的特定字符串

    java - 扩展可比较的泛型

    java - 在JFrame中打开excel文件时出现异常

    java - 检索数据时出错

    java - 将 Spring 2.5 与 Ibatis 3 集成

    java - 如何在CQ5的while循环中计算所有图像的总字节数

    java - 响应中没有 namespace 的 SOAP(Spring Boot)

    tomcat - 使用tomcat jdbc pool StatementCache拦截器时出错

    java - Ibatis:将 getter 定义为结果的属性

    java - 使用MyBatis调用oracle函数(基于注解)