为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Java 中编写等同于匿名类的内容?

如何在 Java 中编写等同于匿名类的内容?

Go
白猪掌柜的 2023-04-04 15:33:43
这更像是一个与接口/函数/闭包/类型/...相关的通用 Go 问题,但具有执行 I/O 的具体用例。给定一个io.Reader变量,我想创建一个io.ReadCloser自定义Close()实现。var file os.Filefile = ... // some File which needs to be closedvar reader io.Readerreader = ... // get Reader from somewherevar readCloser io.ReadCloserreadCloser = ... // how to create a ReadCloser here?在Java中,我会写这样的东西:readCloser = new io.ReadCloser() {    Read(p []byte) {        reader.Read(p);    }    Close() {        // my custom close implementation        file.Close()    }    }// now pass readCloser around as needed如何用 Go 做到这一点?
查看完整描述

2 回答

?
慕后森

TA贡献1802条经验 获得超5个赞

从中得到提示http.HandlerFunc,我可以想到以下内容


package main


import (

    "bytes"

    "fmt"

    "io"

    "strings"

)


// ReadData reads data from an io.Reader

func ReadData(r io.Reader) {

    buf := new(bytes.Buffer)

    buf.ReadFrom(r)

    s := buf.String()

    fmt.Printf("read : %s \n", s)

}


// ReaderFunc takes a function and returns io.Reader

type ReaderFunc func([]byte) (int, error)


func (r ReaderFunc) Read(b []byte) (int, error) {

    return r(b)

}


func main() {

    // invoking ReadData with a regular io.Reader

    r := strings.NewReader("data 123")

    ReadData(r)


    // invoking ReadData with an anonymous io.Reader

    r = strings.NewReader("data 456")

    ReadData(ReaderFunc(func(b []byte) (int, error) {

        return r.Read(b)

    }))

}


查看完整回答
反对 回复 2023-04-04
?
暮色呼如

TA贡献1853条经验 获得超9个赞

一种方法是创建您自己的类型,将 aio.Reader和 a结合起来io.Closer并实现io.ReadCloser接口。是这样的:


type ReadCloseCombiner struct {

    io.Reader

    io.Closer

}


func (rcc ReadCloseCombiner) Read(p []byte) (n int, err error) {

    return rcc.Reader.Read(p)

}


func (rcc ReadCloseCombiner) Close() error {

    return rcc.Closer.Close()

}

并像这样使用它:


var file *os.File

file = ... // some File which needs to be closed


var reader io.Reader

reader = ... // get Reader from somewhere


var readCloser io.ReadCloser

readCloser = ReadCloseCombiner{reader, file}


// now pass readCloser around as needed

readCloser.Read(...)

readCloser.Close()

如果您想要更灵活的东西,我会考虑使用一种类型来代替读取和关闭函数,然后您可以将它传递给匿名函数(或者甚至reader.Read/file.Close在您的情况下)。

一种方法是创建您自己的类型,将 aio.Reader和 a结合起来io.Closer并实现io.ReadCloser接口。是这样的:


type ReadCloseCombiner struct {

    io.Reader

    io.Closer

}


func (rcc ReadCloseCombiner) Read(p []byte) (n int, err error) {

    return rcc.Reader.Read(p)

}


func (rcc ReadCloseCombiner) Close() error {

    return rcc.Closer.Close()

}

并像这样使用它:


var file *os.File

file = ... // some File which needs to be closed


var reader io.Reader

reader = ... // get Reader from somewhere


var readCloser io.ReadCloser

readCloser = ReadCloseCombiner{reader, file}


// now pass readCloser around as needed

readCloser.Read(...)

readCloser.Close()

如果您想要更灵活的东西,我会考虑使用一种类型来代替读取和关闭函数,然后您可以将它传递给匿名函数(或者甚至reader.Read/file.Close在您的情况下)。


查看完整回答
反对 回复 2023-04-04
  • 2 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信