001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.fukurou.util; 017 018import java.util.LinkedHashSet; 019import java.util.Arrays; // 8.5.3.2 (2023/10/13) 020import java.util.Collection; // 7.0.1.1 (2018/10/22) 021//import java.util.Collections; 022import java.util.Iterator; 023import java.util.function.BiConsumer; 024 025import static org.opengion.fukurou.system.HybsConst.BUFFER_MIDDLE; // 7.0.1.1 (2018/10/22) 026 027/** 028 * ArraySet.java は、LinkedHashSet を継承した、Setオブジェクトです。 029 * 030 * 初期オブジェクト作成のための、引数に、配列(可変長配列)を渡せるようにしています。 031 * また、Iterable#forEach( Consumer ) で、ループカウンタが使えるように、新しく、 032 * BiConsumer を引数に取る forEach( int , BiConsumer ) メソッドを用意しています。 033 * 034 * @og.rev 6.4.3.4 (2016/03/11) 新規追加 035 * 036 * @version 6.4 037 * @author Kazuhiko Hasegawa 038 * @since JDK8.0, 039 * 040 * @param <E> 型オブジェクト 041 */ 042public class ArraySet<E> extends LinkedHashSet<E> { 043 /** このプログラムのVERSION文字列を設定します。 {@value} */ 044 private static final String VERSION = "8.5.3.2 (2023/10/13)"; 045 private static final long serialVersionUID = 853220231013L ; 046 047 /** 048 * LinkedHashSet を継承した、Setオブジェクトです。 049 * 050 * 初期オブジェクト作成のための、引数に、配列を渡せるようにしています。 051 * 052 * @og.rev 7.0.1.1 (2018/10/22) 新規追加 053 * @og.rev 8.5.3.2 (2023/10/13) JDK21対応。警告: [this-escape] サブクラスが初期化される前の'this'エスケープの可能性があります 054 * 055 * @param elements 初期値として設定する可変長配列 056 */ 057 @SuppressWarnings({"unchecked", "varargs"}) 058 public ArraySet( final E... elements ) { 059// super(); 060// Collections.addAll( this, elements ); 061 super( Arrays.asList( elements ) ); // 8.5.3.2 (2023/10/13) 062 } 063 064 /** 065 * 他のCollectionオブジェクトを追加します。 066 * 067 * @og.rev 6.4.3.4 (2016/03/11) 新規追加 068 * 069 * @param collect Collectionオブジェクトの可変長配列 070 * @return 自分自身 071 */ 072 @SuppressWarnings({"unchecked"}) 073 public ArraySet<E> addAll( final Collection<E>... collect ) { // 8.5.4.2 (2024/01/12) PMD 7.0.0 LooseCoupling //NOPMD 074 if( collect != null && collect.length > 0 ) { 075 for( final Collection<E> obj : collect ) { 076 super.addAll( obj ); 077 } 078 } 079 return this ; 080 } 081 082 /** 083 * Iterable#forEach( Consumer ) で、引数に、ループカウンタを使用できるメソッドです。 084 * 085 * ラムダ式から参照されるローカル変数は、finalまたは事実上のfinalである必要があります。 086 * ところが、訳あって、ループカウンタが必要です。そこで、内部処理として、ループカウンタを 087 * 用意しておき、それを、ラムダ式の引数として渡す方法で、対応します。 088 * 一覧の処理は、内部で、Iterator#hasNext() と、Iterator#next() を使用しているため、 089 * インスタンスレベルのsynchronized ブロックを使用しています。 090 * 091 * @og.rev 6.4.3.4 (2016/03/11) 新規追加 092 * 093 * @param cnt カウンタの初期値 094 * @param action 各要素に対して実行されるアクション( カウンタ、内部オブジェクト ) 095 * @see Iterable#forEach( Consumer ) 096 */ 097 public void forEach( final int cnt , final BiConsumer<Integer ,E> action ) { 098 // 8.5.4.2 (2024/01/12) PMD 7.0.0 ShortVariable i ⇒ ii に変更 099 int ii = cnt; 100 synchronized( this ) { 101 final Iterator<E> ite = iterator(); 102 while( ite.hasNext() ) { 103 action.accept( ii++ , ite.next() ); 104 } 105 } 106 } 107 108 /** 109 * このオブジェクトの内部表現を、文字列にして返します。 110 * 内部オブジェクトの toString() を順番に呼んで、カンマで連結した文字列を返します。 111 * 112 * @og.rev 7.0.1.1 (2018/10/22) 新規追加 113 * 114 * @return 引数に対する値 115 * @og.rtnNotNull 116 */ 117 @Override // Object 118 public String toString() { 119 final StringBuilder buf = new StringBuilder( BUFFER_MIDDLE ); 120 121 synchronized( this ) { 122 final Iterator<E> ite = iterator(); 123 while( ite.hasNext() ) { 124 buf.append( ite.next() ).append( ',' ); 125 } 126 } 127 128 if( buf.length() > 0 ) { buf.setLength( buf.length()-1 ); } // 最後のカンマを削除 129 130 return buf.toString(); 131 } 132}