【问题标题】:Creating a wrapper Class创建包装类
【发布时间】:2010-02-14 02:54:57
【问题描述】:

我的 Spring MVC Web 应用程序中有两个类定义,分别命名为 Class 和 Object:

public Class {
//instance variables
int classId;
int className;


}


public Object {
    //instance variables
int objectId;
int objectName;


}

我还有一个服务,它返回定义如下的类和对象列表。

package com.service;


import java.util.ArrayList;
import java.util.List;
import java.util.Iterator;
import com.domain.Class;
import com.domain.Object;
import com.service.SearchManager;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;


import java.io.Serializable;

public class SempediaSearchManager implements com.service.SearchManager {

    private SessionFactory sessionFactory;
    private List<Class> classes;
    private List<Object> objects;



     public List<Class> getClassSeedSearch(String classSeed) {
         Configuration configuration = new Configuration().configure();
         sessionFactory = configuration.buildSessionFactory();
         Session session = sessionFactory.openSession();
         try {
         Query query = session.createQuery("from Class c where lower(c.className) like lower('"
                 + classSeed + "%')");
         return query.list();
         } finally {
         session.close();
         }

     }
     public List<Object> getObjectSeedSearch(String objectSeed) {
         Configuration configuration = new Configuration().configure();
         sessionFactory = configuration.buildSessionFactory();
         Session session = sessionFactory.openSession();
         try {
         Query query = session.createQuery("from Object o where lower(o.objectName) like lower('"
                 + objectSeed + "%')");
         return query.list();
         } finally {
         session.close();
         }
     }


     ?????
     skeleton method
     public List<ClassesAndObjects> getObjectorClassSeedSearch(String objectOrClassSeed) {
      ?????
     }

我展示的视图有一个搜索框,允许用户根据 getObjectSeedSearch 和 getClassSeedSearch - List、List 方法返回的对应列表搜索类或对象

我想让搜索文本框简单地搜索类和对象,可能返回一个合并列表 - 列表 - 如果你希望通过利用方法 getObjectorClassSeedSearch强>

实现这一点的最佳方式是什么。 我隐约知道我想创建一个包装类,它可以同时使用 Class 和 Object ,并且可能在运行时多态地确定从列表中返回的实例和项目是什么。我猜我的应用程序中会有一个相应的bean。也许是泛型的练习。

什么是有效的方法?

谢谢

【问题讨论】:

    标签: java spring spring-mvc


    【解决方案1】:

    对它们都有一个共同的接口/抽象类:

    public abstract class Name
    {
        private int id;
        private String name;
        // all attendant ctors and getter/setter stuff here.
    }
    

    您可以通过这种方式根据需要返回一个 List

    好名字很重要。重载“类”和“对象”,当它们已经是 java.lang 包的一部分时,只会让您和您的代码的未来维护者感到悲痛。

    这些可能是示例,但我认为这些类中的任何一个都没有理由。没有抽象或丰富的行为。根据我在这里看到的情况,我会说这是一个值得重新思考的设计。

    【讨论】:

    • 谢谢。但是假设我没有使用 Class 和 Object 类定义,并且使用了两个不同的,可能使用不同的方法和实例变量,除了实例变量;两个类共有的 clas1Name、class1ID、class2Name 和 class2ID 是一种解决方案的方法 - 一个包含任一类对象的列表 - 仍然如您所建议的那样
    • 您提出的设计仍然遇到同样的问题,我的抽象类仍然可以工作。如果您要在 List 中有一个类型,并且您应该想要,那么您必须有一个通用接口或抽象基类。
    【解决方案2】:

    我建议创建一个接口并使用某种 Class 和 Object 都实现的“获取详细信息”方法。找出通用方法可能很困难,但最坏的情况是,您可以使用 instanceof 并在将其从列表中删除后强制转换(尽管这将是糟糕设计的征兆)。

    例如:

    public interface SearchResult {
    
        public String getDetails();
    
    }
    

    然后:

    public class Class implements SearchResult {
        int classId;
        int className;
    
        public String getDetails() {
            return "id " + classId + ", name " + className;
        }
    }
    
    public class Object implements SearchResult {
        int objectId;
        int objectName;
    
        public String getDetails() {
            return "id " + objectId + ", name " + objectName;
        }
    }
    

    显然这是一个简单的例子,但你明白了。

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 2018-04-12
      • 2020-05-24
      • 2012-09-27
      • 1970-01-01
      相关资源
      最近更新 更多