Bawię się w pisanie immutowalnych klas, do tej pory udawało mi się nie mieć ani jednego geta i seta, ale teraz mam problem:
public final class IssueProducerImpl implements IssueProducer {
private final static Logger logger = LoggerFactory.getLogger(IssueProducerImpl.class);
private final Service service;
private final IssueStatus wantedStatus;
private final BlockingQueue<Issue> queue;
@Inject
public IssueProducerImpl(Service service, IssueStatus wantedStatus) {
this.service = service;
this.wantedStatus = wantedStatus;
}
@Override
public void run () {
while ( true ) {
try {
produce(wantedStatus).forEach(i -> queue.offer(i));
Thread.sleep(30000);
} catch ( InterruptedException e ) {
e.printStackTrace();
}
}
}
@Override
public Iterable<Issue> produce( Status status) {
return service.doSth(status);
}
@Override
public void setQueue(BlockingQueue<Issue>(BlockingQueue<Issue> queue) {
this.queue = queue;
}
}
Użycie:
public final class PernIssueStatusChanger {
private final IssueProducer producer;
private final IssueConsumer consumer;
@Inject
public PernIssueStatusChanger(IssueProducer producer, IssueConsumer consumer, BlockinQueue<Issue> queue) {
producer.setQueue(queue);
consumer.setQueue(queue);
this.producer = producer;
this.consumer = consumer;
}
public void start() throws InterruptedException {
new Thread(producer).start();
new Thread(consumer).start();
}
}
jak pozbyć się tego seta by obiekt był niemutowalny?
Z tego co mi przychodzi do głowy zaryzykowałbym najbardziej opakowanie tego w drugi obiekt
public final class IssueProducerCreatorImpl {
private final Service service;
private final IssueStatus wantedStatus;
@Inject
public IssueProducerCreatorImpl (Service service, IssueStatus wantedStatus) {
this.service = service;
this.wantedStatus = wantedStatus;
}
public IssueProducer getIssueProducer(BlockingQueue<Issue> queue) {
return new IssueProducerImpl(service, wantedStatus, queue);
}
}
i
public final class IssueProducerImpl implements IssueProducer {
private final static Logger logger = LoggerFactory.getLogger(IssueProducerImpl.class);
private final Service service;
private final IssueStatus wantedStatus;
private final BlockingQueue<Issue> queue;
// no injection!
// package scope
IssueProducerImpl(IssueProducerConfiguration conf, BlockingQueue<Issue> queue) {
this.service = conf.service;
this.wantedStatus = conf.wantedStatus;
this.queue = queue;
}
@Override
public void run () {
while ( true ) {
try {
produce(wantedStatus).forEach(i -> queue.offer(i));
Thread.sleep(30000);
} catch ( InterruptedException e ) {
e.printStackTrace();
}
}
}
@Override
public Iterable<Issue> produce( Status status) {
return service.doSth(status);
}
}
Użycie:
public final class StatusChanger{
private final IssueProducer producer;
private final IssueConsumer consumer;
@Inject
public StatusChanger(IssueProducerCreatorImpl producerCreator, IssueConsumerCreatorImpl consumerCreator, BlockinQueue<Issue> queue) {
this.producer = producerCreator.getIssueProducer(queue);
this.consumer = consumerCreator.getIssueConsumer(queue);
}
public void start() throws InterruptedException {
new Thread(producer).start();
new Thread(consumer).start();
}
}