将当前类属性注入新类的构造函数中

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将当前类属性注入新类的构造函数中相关的知识,希望对你有一定的参考价值。

我正在尝试创建一个初始化WEBrick服务器的类,该服务器包含一个WEBrick servlet,如果没有给出请求路径,它将返回一些默认的html字符串。

主要问题是我将当前类的实例变量注入到新类的构造函数中,这是我真的不知道该怎么做的事情。

class MyServer
  def initialize(defaultHTML)
    @defaultHtml = defaultHTML
    @server = WEBrick::HTTPServer.new(
      :Port => 12357,
      :DocumentRoot = Dir.pwd
    )
    defaultGetHandler = Class.new(WEBrick::HTTPServlet::AbstractServlet) do
      def do_GET(request,response)
        if request.path.to_s == "/"
          response.body = #SOMEHOW get @defaultHTML here...?
        end
      end
    end
    @server.mount "/", defaultGetHandler
  end
end

我希望这是可能的。我已经尝试过使用全局变量,这些确实可行,但它并不完全理想。

答案

注意:@engineersmnky的答案对于您的特定用例来说要好得多。这个答案可能对寻求类似但不是WEBrick::HTTPServlet::AbstractServlet相关问题的解决方案的人感兴趣。

你可以定义一个类实例变量访问器,并在动态创建类之后传入defaultHtml,如下所示:

class MyServer
  def initialize(defaultHTML)
    @defaultHtml = defaultHTML
    @server = WEBrick::HTTPServer.new(
      :Port => 12357,
      :DocumentRoot = Dir.pwd
    )
    defaultGetHandler = Class.new(WEBrick::HTTPServlet::AbstractServlet) do
      class << self
        attr_accessor :defaultHtml  # class level attr_accessor
      end

      def do_GET(request,response)
        if request.path.to_s == "/"
          # reference to class level instance variable:
          response.body = self.class.defaultHtml 
        end
      end
    end

    defaultGetHandler.defaultHtml = @defaultHtml

    @server.mount "/", defaultGetHandler
  end
end
另一答案

似乎WEBrick::HTTPServlet::AbstractServlet已经为此提供了适当的接口(Documentation),例如

 class DefaultGetHandler < WEBrick::HTTPServlet::AbstractServlet
   def initialize(server,default_html)
     super(server)
     @default_html = default_html
   end 
   def do_GET(request,response)
     if request.path.to_s == "/"
      response.body = @default_html
     end
   end
 end

然后MyServer成为

class MyServer
  def initialize(default_html)
    @server = WEBrick::HTTPServer.new(
      :Port => 12357,
      :DocumentRoot = Dir.pwd
    )

    @server.mount "/", DefaultGetHandler, default_html
  end
end

这将允许您避免现在正在创建的所有匿名类定义,并为您提供更清晰的自定义类实现。你可以在DefaultGetHandler中命名空间MyServer如果你想保持你目前拥有的封装

以上是关于将当前类属性注入新类的构造函数中的主要内容,如果未能解决你的问题,请参考以下文章

java中代码执行顺序

为啥使用set注入,一定要给类提供一个无参的构造函数,否则Spring不能实例化类的.

[spring] Ioc 基础

通过构造函数或属性设置器进行依赖注入?

如何通过单击适配器类中代码的项目中的删除按钮来删除列表视图中的项目后重新加载片段?

java中,子类的构造器为啥要调用父类构造器?