001 /*--------------------------------------------------------------------------+ 002 $Id: UnmodifiableList.java 26283 2010-02-18 11:18:57Z juergens $ 003 | | 004 | Copyright 2005-2010 Technische Universitaet Muenchen | 005 | | 006 | Licensed under the Apache License, Version 2.0 (the "License"); | 007 | you may not use this file except in compliance with the License. | 008 | You may obtain a copy of the License at | 009 | | 010 | http://www.apache.org/licenses/LICENSE-2.0 | 011 | | 012 | Unless required by applicable law or agreed to in writing, software | 013 | distributed under the License is distributed on an "AS IS" BASIS, | 014 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 015 | See the License for the specific language governing permissions and | 016 | limitations under the License. | 017 +--------------------------------------------------------------------------*/ 018 package edu.tum.cs.commons.collections; 019 020 import java.util.Collection; 021 import java.util.Collections; 022 import java.util.List; 023 024 /** 025 * This is a wrapper for a {@link List} prohibiting all calls which would modify 026 * its contents. As the construction of this class is performed in constant time 027 * it is prefered over copying the list (which takes linear time). Using this 028 * class is also preferred to using the <code>unmodifiableX()</code> in class 029 * {@link Collections} as they return the collection base type that does not 030 * signal, that the object ist unmodifiable. Using the classes in this package 031 * makes unmodifiability more explicit. 032 * <p> 033 * All prohibited methods throw an {@link UnsupportedOperationException}. The 034 * class is nearly the same as the one returned by 035 * {@link Collections#unmodifiableList(List)}, but by making it a public class 036 * we can make the return value of some methods more explicit. 037 * <p> 038 * This list is serializable if the wrapped list is serializable. 039 * 040 * @author Benjamin Hummel 041 * @author $Author: juergens $ 042 * 043 * @version $Revision: 26283 $ 044 * @levd.rating GREEN Hash: 4B2E02522B37EA43AB9DDF9C28DCC2E1 045 */ 046 public class UnmodifiableList<E> extends UnmodifiableCollection<E> implements 047 List<E> { 048 049 /** The underlying list. */ 050 private final List<E> l; 051 052 /** 053 * Creates a new unmodifiable list from another list. All modifications to 054 * the underlying list will directly be visible in this wrapper. 055 */ 056 public UnmodifiableList(List<E> l) { 057 super(l); 058 this.l = l; 059 } 060 061 /** {@inheritDoc} */ 062 public E get(int index) { 063 return l.get(index); 064 } 065 066 /** {@inheritDoc} */ 067 public int indexOf(Object o) { 068 return l.indexOf(o); 069 } 070 071 /** {@inheritDoc} */ 072 public int lastIndexOf(Object o) { 073 return l.lastIndexOf(o); 074 } 075 076 /** {@inheritDoc} */ 077 public UnmodifiableListIterator<E> listIterator() { 078 return new UnmodifiableListIterator<E>(l.listIterator()); 079 } 080 081 /** {@inheritDoc} */ 082 public UnmodifiableListIterator<E> listIterator(int index) { 083 return new UnmodifiableListIterator<E>(l.listIterator(index)); 084 } 085 086 /** {@inheritDoc} */ 087 public List<E> subList(int fromIndex, int toIndex) { 088 return new UnmodifiableList<E>(l.subList(fromIndex, toIndex)); 089 } 090 091 /** 092 * Operation is not supported. 093 * 094 * @throws UnsupportedOperationException 095 */ 096 public void add(int arg0, E arg1) { 097 throw new UnsupportedOperationException(); 098 } 099 100 /** 101 * Operation is not supported. 102 * 103 * @throws UnsupportedOperationException 104 */ 105 public boolean addAll(int arg0, Collection<? extends E> arg1) { 106 throw new UnsupportedOperationException(); 107 } 108 109 /** 110 * Operation is not supported. 111 * 112 * @throws UnsupportedOperationException 113 */ 114 public E remove(int arg0) { 115 throw new UnsupportedOperationException(); 116 } 117 118 /** 119 * Operation is not supported. 120 * 121 * @throws UnsupportedOperationException 122 */ 123 public E set(int arg0, E arg1) { 124 throw new UnsupportedOperationException(); 125 } 126 }