子类的Java解决方法被强制在构造函数中调用super()?

时间:2011-06-22 23:38:39

标签: java subclass super superclass

我正在编辑一个使用RandomAccessFile对象的程序,我想提出我自己的RandomAccessFile类,它使用不同于文件对象的数据源(它是一个Amazon webservices S3对象,但这是无关紧要的)

我想基本上创建一个名为RandomAccessS3的类,它将RandomAccessFile作为其超类,所以我可以简单地说

RandomAccessFile raf = new RandomAccessS3();

因此保持现有代码相同。我将简单地覆盖RandomAccessFile中的每个方法。

问题是在子类RandomAccessS3的构造函数中,我被迫使用super(文件,模式)调用RandomAccessFile的构造函数,该函数将参数作为文件名,并抛出错误并在文件无效时死亡。

我无法使用try / catch块包围super()调用,因为super需要是构造函数中的第一行。我可以提供一个虚拟文件,但我不想强迫用户这样做。这有什么简单的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:4)

好吧,你实际上可以在超类上设置一个名称属性。在该类的构造函数中,将传入的String的值设置为属于该类的名称实例变量。

这样,所有派生类必须在实例化子实例时传入某些内容,并且传递的值将延迟到父类。这样你可以强制super()总是被衍生物调​​用。

答案 1 :(得分:3)

这没有简单的方法。构造函数用于确保实例处于良好/有效状态,而RandomAccessFile的部分契约是实例链接到有效文件。

作为一个巨大的黑客,我想你可以创建一个临时文件,只是为了满足RandomAccessFile构造函数。

更好的方法可能是创建一个新接口并将RandomAccessFile的引用更新到新接口。然后,实现接口两次,一次使用RandomAccessFile,一次使用S3调用。