【问题标题】:why does a constructor work this way?为什么构造函数会这样工作?
【发布时间】:2015-02-10 10:29:05
【问题描述】:

我在 c# 中有一个构造函数,也可以是 Java,用于使用 activeMQ 的类。该类被多次实例化,每次发布在一个单独的主题上,由传递给构造函数的变量String destination定义,如下:

class Publisher
{
  // Class variables constructed in constructor then used from outside class
  public IConnection connection = null;
  public ISession session = null;
  public IMessageProducer producer = null;

  // Constructor
  public Publisher (String destination)
  {
    String user = "USER";
    String password = "PASSWORD";
    String host = "localhost";
    int port = Int32.Parse("61616");

    String brokerUri = "activemq:tcp://" + host + ":" + port;
    NMSConnectionFactory factory = new NMSConnectionFactory(brokerUri);

    connection = factory.CreateConnection(user, password);
    connection.Start();
    session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge);
    IDestination dest = session.GetTopic(destination);
    producer = session.CreateProducer(dest);
    producer.DeliveryMode = MsgDeliveryMode.NonPersistent;
  }

  public void Stop ()
  {
    producer.Send(session.CreateTextMessage("SHUTDOWN"));
    connection.Close();
    Console.ReadLine();
  }

  public void Publish(String data)
  {
    producer.Send(session.CreateTextMessage(data));
  }
}

问题是编译器如何知道将3个activeMQ公共变量connection, session, producer分配给相关实例?

即从我可以调用的其他课程中

Publisher pub1 = new Publisher("topic1");
Publisher pub2 = new Publisher("topic2");
Publisher pub3 = new Publisher("topic3");

然后

pub1.Publish("stuff1");
pub2.Publish("stuff2");
pub3.Publish("stuff3");

一切正常。 “东西”都发布到正确的主题,不需要显式传递 3 个公共 activeMQ 变量connection, session, producer,它们并不总是相同的,生产者和会话都用不同的目的地实例化......

无论如何,它有效,但我想了解更多关于为什么,以及每个构造函数如何知道哪个实例。

【问题讨论】:

  • 这是基本的 OOP。 constructor 在创建时在实例上执行 - 任何实例字段/属性仅适用于该实例。附带说明-您的构造函数做的工作太多了。构造函数应该只做最少的事情来创建一个类。任何进一步的操作都应通过方法(InitConnectStart 等)完成
  • 我不确定你在说什么,这些是Publisher 实例的变量。这不是真正询问编译器如何工作的地方。
  • 每个实例都有自己的内存块。例如,每个都有自己的connection 变量。
  • @rupweb "destination" 不是属性,它是构造函数的参数,它初始化 connectionsessionproducer 字段,每个字段都是该实例的一部分状态。
  • @rupweb 一个轻型构造函数是一个design principle。他们应该尽可能少地为您提供有效的实例。您的构造函数确实设置了实例字段,但也尝试连接到外部资源。该操作应在单独的方法中显式完成,以便客户端可以选择何时连接。

标签: c# activemq


【解决方案1】:

无论destination 变量如何,每个类实例都有自己的内存块。

constructor design 之后,我将sessiondestinationproducer 对象移到了一个方法中。这些都应该使用connection,现在可能在try / catch 块中,尽管这可能也应该是一种方法。

在某处调用新方法,实例化类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2014-03-18
    • 1970-01-01
    相关资源
    最近更新 更多