队列Queue:一个被遗失的java.util类(完)

博客介绍了Java中队列Queue类的实现方法。第二种方法基于链接表Linkedlist类实现,可克服性能问题,但继承关系会导致使用者调用继承函数引发错误。第三种方法采用对象组合方式代替继承,实现了更强大集中的队列类,不过开发者需对所需接口编码处理。

                            队列Queue:一个被遗失的java.util类  

第二种方法


        为了克服上面提及到的性能问题,这个方法中,队列Queue类的实现建立在链接表Linkedlist类的基础上,因为链接表Linkedlist对于第一个元素的删除不会导致其它剩余元素位置的移动。
public class Queue2 extends LinkedList
{
 public Object enqueue (Object element) 
 {
  add (element);
  return element;
 }

 public Object dequeue ()
 {
  if (size()== 0) 
   throw new EmptyQueueException() ;
  return removeFirst();  
 }
}

      然而,就是我们在方法中应用的继承关系导致了一个问题。使得Queue2 class 的使用者可以调用一些像addFirst、getLast 等等这些继承来的函数方法,导致一些无法预期的错误。

第三种方法

       在这个方法中对象组合方式将代替继承方式。一般来讲,对象组合方式优于继承方式,它提供了较小而且比较集中的类和较小规模的继承层次,很多的设计者过分使用继承,导致了庞大的继承层次关系,以至于变得很难维护和处理。一个基于对象组合的设计会有相对较少的类文件,但同时会产生较多的对象了。

public class Queue
{

 private LinkedList items;

 public Object enqueue (Object element)
 {
  items.add (element);
  return element;
 }

 public Object dequeue ()
 {
  if (items.size()== 0) 
   throw new EmptyQueueException() ;
  return items.removeFirst();  
 }
}

      这种实现方式实现了一个更加强大,更加集中的队列Quene 类,但开发者需要明确地对所有需要的接口进行编码处理(像size,empty,indexOf等方法)。这种方法完整的代码可以下载获得:

下载代码

 Translated by windowsDNA 2004/01/08

2025-08-26T11:15:07.632+08:00 WARN 11 --- [log-server] [Spring.bean-921] [ ] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed. ... 14 common frames omitted at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:366) at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:285) at java.base/java.lang.reflect.Method.invoke(Method.java:569) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at jdk.internal.reflect.GeneratedMethodAccessor60.invoke(Unknown Source) at com.hd.cloud.log.queue.consumer.listener.MessageDelegate.handleMessageHd(MessageDelegate.java:45) at com.hd.cloud.log.queue.consumer.service.impl.MessageConsumerServiceImpl.receiveHdMessage(MessageConsumerServiceImpl.java:177) at com.hd.cloud.log.service.ELKLoggerServiceImpl.saveHdLog(ELKLoggerServiceImpl.java:182) at com.hd.cloud.log.elasticsearch.service.impl.ElasticsearchServiceImpl.addHdLogInfo(ElasticsearchServiceImpl.java:262) at co.elastic.clients.elasticsearch.ElasticsearchClient.index(ElasticsearchClient.java:1196) at co.elastic.clients.elasticsearch.ElasticsearchClient.index(ElasticsearchClient.java:1177) at co.elastic.clients.transport.ElasticsearchTransportBase.performRequest(ElasticsearchTransportBase.java:147) at co.elastic.clients.transport.ElasticsearchTransportBase.getApiResponse(ElasticsearchTransportBase.java:345) Caused by: co.elastic.clients.elasticsearch._types.ElasticsearchException: [es/index] failed: [illegal_argument_exception] Document contains at least one immense term in field="messageInfo" (whose UTF8 encoding is longer than the max length 32766), all of which were skipped. Please correct the analyzer to not produce such terms. The prefix of the first immense term is: '[98, 97, 113, 101, 98, 97, 113, 101, 98, 97, 113, 101, 98, 97, 113, 101, 98, 97, 113, 101, 98, 97, 113, 101, 98, 97, 113, 101, 98, 97]...', original message: bytes can be at most 32766 in length; got 87205 at java.base/java.lang.Thread.run(Thread.java:840) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1322) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.mainLoop(SimpleMessageListenerContainer.java:1421) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:1018) at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:1082) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1506) at io.micrometer.observation.Observation.observe(Observation.java:499) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.lambda$executeListener$8(AbstractMessageListenerContainer.java:1506) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListenerAndHandleException(AbstractMessageListenerContainer.java:1528) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:1583) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1592) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1604) at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1682) at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.onMessage(MessageListenerAdapter.java:293) at org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter.invokeListenerMethod(MessageListenerAdapter.java:374) org.springframework.amqp.rabbit.support.ListenerExecutionFailedException: Listener method 'handleMessageHd' threw exception
08-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值