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