Вы можете сделать это:
List<X> list = Arrays.asList(new X[desiredSize]);
// where X is any Object type (including arrays and enums,
// but excluding primitives)
Полученный список можно изменять, но нельзя изменять его размер (т. Е. add(e)
и remove(e)
неработает, но set(index, e)
делает).
Ссылка:
Или: используя Гуава , вот статический метод, который украшает существующий список с максимальным размером
public static <T> List<T> setMaxSize(
final List<T> input, final int maxSize){
return new ForwardingList<T>(){
@Override
public boolean addAll(Collection<? extends T> collection){
return standardAddAll(collection);
}
@Override
public boolean addAll(int index, Collection<? extends T> elements){
return standardAddAll(index, elements);
}
public boolean add(T e) {
checkMaxSize();
return delegate().add(e);
}
@Override
public void add(final int index, final T e){
checkMaxSize();
delegate().add(index, e);
}
private void checkMaxSize(){
if(size() >= maxSize){
throw new UnsupportedOperationException("Maximum Size "
+ maxSize + " reached");
}
}
@Override
protected List<T> delegate(){
return input;
}
};
}
Поскольку классы ForwardingXxx существуют для всех стандартных коллекцийтипы, вы можете написать себе аналогичные декораторы и для других коллекций.
Очевидно, это будет работать, только если ваш клиентский код использует декорированную коллекцию.Если вы изменяете базовую коллекцию, которую вы ввернули (как методы Collections.unmodifiableXXX)
Ссылка: