Java中如何解决子类在构造函数必须调用super()的问题?

3
我正在编辑一个使用RandomAccessFile对象的程序,我想创建自己的RandomAccessFile类,该类使用与文件对象不同的数据源(它是Amazon Web服务S3对象,但这是无关紧要的)。
我想基本上创建一个名为RandomAccessS3的类,它以RandomAccessFile作为其超类,这样我就可以简单地说:
RandomAccessFile raf = new RandomAccessS3();
因此保持现有代码不变。我将简单地覆盖RandomAccessFile中的每个方法。
问题在于,在子类RandomAccessS3的构造函数中,我被强制使用super(file, mode)调用RandomAccessFile的构造函数,该函数需要一个文件名作为参数,并且如果文件无效,则会引发错误并停止运行。
我不能使用try/catch块包围super()调用,因为super必须是构造函数中的第一行。我可以提供一个虚拟文件,但我不想强制用户这样做。有没有简单的方法解决这个问题?
谢谢!

4
由于RandomAccessS3不是RandomAccessFile,所以你的想法从长远来看并不合理。我建议你重构代码,使用比RandomAccessFile更通用的东西。 - Oliver Charlesworth
2个回答

4

其实你可以在父类上设置一个name属性,然后在该类的构造函数中将传入的String值设置为该类所属的name实例变量的值。

这样所有的子类实例化时都必须传入参数并且传递的值会被延迟到父类。这样你可以强制子类始终调用super()方法。


3

这个问题没有简单的解决方法。构造函数的作用是确保实例处于良好/有效的状态,而RandomAccessFile的合同的一部分是实例与有效文件相关联。

作为一种巨大的hack,我认为你可以创建一个临时文件,只是为了满足RandomAccessFile构造函数的要求。

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


那样行吗?我的意思是RandomAccessFile在java.io中,我不能在那里写“implements RandomAccessInterface”或其他什么。 - Bobby Pardridge
以下是我的意思:接口 Foo { void doSomething(); } 类 Bar 实现了接口 Foo { final private RandomAccessFile file; Bar(RandomAccessFile f) { this.file = f; } public void doSomething() { // 使用 this.file 做些事情 } } - jtoberon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接