覆盖File类toString,而不必创建覆盖类类型的对象

时间:2019-02-17 22:44:35

标签: java override

我有ArrayList个文件要打印到控制台。.toString()类的ArrayList方法很好,但是我不想打印File对象的路径名,我不会像调用getName()方法时那样打印其名称。

我想像这样简单:

class overridingClass extends File {
    @Override
    public String toString() {
        return Super.getName();
    }
}

是否可以通过某种方式覆盖文件toString()方法而不必将我的File对象更改为overridingClass个对象

PS:为此,我已经搜索了两个小时,甚至找不到关于覆盖内置类方法的任何信息,因此,如果有人也找不到它,就可以进行问答。很棒,可能在这里放了一个链接

1 个答案:

答案 0 :(得分:1)

尝试将自定义打印方法直接绑定到const path = require('path') const mode = process.env.NODE_ENV const MiniCSSExtractPlugin = require('mini-css-extract-plugin') module.exports = { mode, entry: ['./resources/scripts/main.js', './resources/sass/main.sass'], output: { path: path.join(__dirname, 'public'), filename: '[name].bundle.js', publicPath: '/public' }, plugins: [ new MiniCSSExtractPlugin({ filename: mode == 'production' ? '[name].[hash].css' : '[name].css', chunkFilename: mode == 'production' ? '[id].[hash].css' : '[id].css' }) ], module: { rules: [ { test: /\.js$/, exclude: /(node_modules|bower_components)/, use: { loader: 'babel-loader?cacheDirectory=true', options: { presets: ['@babel/preset-env'] } } }, { test: /\.(sa|c|sc)ss$/, exclude: /(node_modules|bower_components)/, use: [ mode == 'production' ? MiniCSSExtractPlugin.loader : 'style-loader', 'css-loader', 'sass-loader' ] } ] } } 对象会破坏single responsibility principle。可能有多种有效的方法来打印列表的内容。将每种打印方法直接添加到类中会很快使类膨胀,并且还会使类的用户感到困惑。

最实用的方法是创建一个单独的对象或实用程序方法来执行这项工作。

File

按照您的常规逻辑,现在可以使用此public class FileNamePrinter { public String print(List<File> files) { StringJoiner joiner = new StringJoiner("," "[", "]"); for (File file : files) { joiner.add(file.getName()); } return joiner.toString(); } } 对象执行翻译。

FilePrinter

另一种选择是根据List<File> files = ...; FileNamePrinter printer = new FileNamePrinter(); System.out.println(printer.print(files)); 方法将文件列表转换为字符串列表,然后打印该列表

getName