2013-03-08 89 views
0

我已经发布了一些相关的代码在此问题: 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

也许这是不好的设计,但我没有找到任何有关我的问题的信息和用例。

+0

你不能......因为接口不能执行任何操作,除了方法签名的实现。 – Mordechai 2013-03-08 07:59:48

+0

嗯,好的。其他技术可能吗?也许抽象类? – sk2212 2013-03-08 08:05:56

回答

1

是的,你可以使用抽象类有明确的构造,即自动呼吁所有子类:

public abstract class IMSSQLStatement { 

    protected IMSSQLHandler handler; 

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

编辑:(参照注释)

如果你想只有处理程序应该能够调用IMSSQLStatement中的方法,这两个类都应该放在同一个包中。通过给出protected修饰符,仅允许包私有和子类访问。虽然这些方法可以在子类本身中调用,但除了包之外,它不能在外部访问。

这不会完全解决您的问题。其他(真正的假)方式将是反射

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

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

+0

好的,处理程序类现在在创建实现类的对象时被调用。但这并不是我想要的。我仍然可以在处理器类的“外部”执行实现类的方法。但我希望只有处理程序类能够执行这些方法。 – sk2212 2013-03-08 08:51:15

+0

谢谢!我已经阅读了一些关于反射的内容来解决这个用例。我只需要使私有方法可访问并调用它。然而,这是一个好习惯吗?这是用在一些“官方”的Java库吗? – sk2212 2013-03-08 09:22:58

+0

它们经常在Java标准类中使用,例如序列化,LookAndFeel加载等等。阅读[这里](http://uet.vnu.edu.vn/~chauttm/e-books/java/Effective.Java.2nd.Edition.May.2008.3000th.Release.pdf)(第230页)和反思的缺点 – Mordechai 2013-03-08 10:06:21

相关问题