代码之家  ›  专栏  ›  技术社区  ›  sk2212

如何强制将对象放入处理程序类

  •  0
  • sk2212  · 技术社区  · 13 年前

    我已经发布了一些关于这个问题的相关代码: Specify object type of a returned array list dynamically

    现在我的问题稍微具体一点。

    事实上,我正在使用以下“处理程序”类来调用实现接口的类的方法 IMSSQLStatement :

    public class MSSQLHandler {
    
        IMSSQLStatement statement;
    
        public MSSQLHandler(IMSSQLStatement statement) {
            this.statement = statement;
        }
    
        public void invoke() throws SQLException {
            statement.executeStatement();
        }
    
        public List<?> getDataList() throws SQLException {
            return statement.getDataList();
        }
    }
    

    现在的问题是如何迫使我(或实现我的接口的开发人员)将已实现类的已创建对象放入 MSSQLHandler ?

    也许这是一个糟糕的设计,但我没有找到任何关于我的问题的信息和用例。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Mordechai    13 年前

    是的,你可以使用一个带有显式构造函数的抽象类,它会在所有子类上自动调用:

    public abstract class IMSSQLStatement {
    
        protected IMSSQLHandler handler;
    
        public IMSSQLStatement() {
            handler = new IMSSQLHandler(this);
        }
    }
    

    编辑:(参考注释)

    如果您希望只有处理程序才能调用中的方法 IMSSQLStatement ,这两个类应该放在同一个包中。仅允许 私人包裹 和子类访问,通过给 protected 修改器。尽管这些方法可以在子类本身中调用,但除了包之外,它在外部是不可访问的。

    这不会完全解决你的问题。另一种(真正的伪造)方式是 反射 .

    要使用反射,您应该在文档中编写子类应该使用的确切方法签名(当然,不要在超类中定义抽象方法),并赋予它 私有的 修改器。处理程序应该通过反射来访问这些方法。

    请参阅一些文档,其中描述了如何使用反射。这很复杂,超出了SO的范围。

    推荐文章