My thoughts based on the conversation so far:

1. How important is it to expose the duplicates/ordering semantics in the 
public API? My preference is to keep it as loose/flexible as possible (e.g. use 
Collection unless there is a specific reason to narrow it further in the public 
API).

As far as choosing the implementation, I've come up with a brief decision tree 
which should (hopefully) help.

Must prevent duplicates?
No:
......Must be thread-safe?
......Yes: use CopyOnWriteArrayList
......No: use ArrayList
Yes:
......Must be thread-safe?
......No:
............Must be ordered?
............No: use HashSet
............Yes:
..................Must preserve the order in which objects were added?
..................No: use TreeSet
..................Yes: use LinkedHashSet
....Yes:
...........Must be ordered?
...........No: use ConcurrentHashSet
...........Yes:
.................Must preserve the order in which objects were added?
.................No: use ConcurrentSkipListSet
.................Yes: use CopyOnWriteArraySet

Cheers,
Steve


On 13/01/16 07:03, Matt Sicker wrote:
What about NavigableSet? ;)

On 12 January 2016 at 13:57, Gary Gregory 
<[email protected]<mailto:[email protected]>> wrote:
For completeness' sake: A set can also be ordered: 
https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html

Gary

On Tue, Jan 12, 2016 at 4:09 AM, Mikael Ståldal 
<<mailto:[email protected]>[email protected]<mailto:[email protected]>>
 wrote:
List is a Collection with the additional semantics of being ordered. Set is a 
Collection with the additional semantics of having no duplicates.

So is the order of the plugins significant? If not it should be Collection or 
Iterable (or possibly Set) rather than List. If the order is significant, we 
should keep it as List.

On Tue, Jan 12, 2016 at 12:59 PM, Mikael Ståldal 
<[email protected]<mailto:[email protected]>> wrote:
If you want it more generic, it should be Iterable rather than Iterator.

On Tue, Jan 12, 2016 at 6:34 AM, sampath kumar 
<<mailto:[email protected]>[email protected]<mailto:[email protected]>>
 wrote:
You Can still achieve enhanced for loop using iterator by using following 
modification.

I apologize if this thread going in different context. We can go with either 
List or Set depending on the Requirement.

Code Snippet:

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class PluginIterator implements Iterable<PluginIterator.Plugin> {

  static class Plugin {
    String name;
    Plugin(String name) {
      this.name<http://this.name> = name;
    }
    public String toString() {
      return "Plugin{" + name + "}";
    }
  }

  Set<Plugin> set = new HashSet<Plugin>();

  public void addPenguin(Plugin p) {
    set.add(p);
  }

  public Iterator<Plugin> getPlugins() {
    return set.iterator();
  }

  public Iterator<Plugin> iterator() {
    return getPlugins();
  }

  public static void main(String args[]) {
PluginIterator pluginIterators = new PluginIterator();
Plugin plugin1 = new Plugin("Plugin-1");
Plugin plugin2 = new Plugin("Plugin-2");
Plugin plugin3 = new Plugin("Plugin-3");
Plugin plugin4 = new Plugin("Plugin-4");
pluginIterators.addPenguin(plugin1);
pluginIterators.addPenguin(plugin2);
pluginIterators.addPenguin(plugin3);
pluginIterators.addPenguin(plugin4);
    for (Plugin p : pluginIterators) {
      System.out.println(p);
    }
  }
}

On Tue, Jan 12, 2016 at 10:24 AM, Gary Gregory 
<<mailto:[email protected]>[email protected]<mailto:[email protected]>>
 wrote:
I dislike this iterator business very much, and you can't use it in a for each 
loop.

Gary

On Mon, Jan 11, 2016 at 8:46 PM, sampath kumar 
<<mailto:[email protected]>[email protected]<mailto:[email protected]>>
 wrote:
How about this, Unmodifiable Iterator

Iterator<String> getPluginPackages();

On Tue, Jan 12, 2016 at 9:50 AM, Gary Gregory 
<<mailto:[email protected]>[email protected]<mailto:[email protected]>>
 wrote:
List<String> getPluginPackages();

G

On Mon, Jan 11, 2016 at 8:12 PM, Paul Benedict 
<<mailto:[email protected]>[email protected]<mailto:[email protected]>>
 wrote:

Thu can only use Set if you have a notion of equality and comparison. Do you 
for this collection?

On Jan 11, 2016 9:48 PM, "Gary Gregory" 
<<mailto:[email protected]>[email protected]<mailto:[email protected]>>
 wrote:
Well, not really, I'd like to express whether the collection allows for 
duplicates or not, if not, use a set.

Gary

On Mon, Jan 11, 2016 at 7:08 PM, Matt Sicker 
<<mailto:[email protected]>[email protected]<mailto:[email protected]>> wrote:
Even a Collection works well for this.


On Monday, 11 January 2016, Gary Gregory 
<<mailto:[email protected]>[email protected]<mailto:[email protected]>>
 wrote:
On Mon, Jan 11, 2016 at 5:19 PM, Ralph Goers 
<[email protected]<mailto:[email protected]>> wrote:
It is returning a List already.  Does it really matter much?

It is not indeed critical. It's just a finer point of declaring the intention 
of the data model, either duplicates are allowed and expected, or not.

Gary

Ralph

On Jan 11, 2016, at 6:04 PM, Gary Gregory 
<[email protected]<mailto:[email protected]>> wrote:

Should APIs like:

org.apache.logging.log4j.core.config.Configuration.getPluginPackages()

really return a List instead of a Set?

Gary

--
E-Mail: [email protected]<mailto:[email protected]> | 
[email protected]<mailto:[email protected]>
Java Persistence with Hibernate, Second Edition<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition<http://www.manning.com/tahchiev/>
Spring Batch in Action<http://www.manning.com/templier/>
Blog: <http://garygregory.wordpress.com/> http://garygregory.wordpress.com
Home: <http://garygregory.com/> http://garygregory.com/
Tweet! <http://twitter.com/GaryGregory> http://twitter.com/GaryGregory




--
E-Mail: [email protected]<mailto:[email protected]> | 
[email protected]<mailto:[email protected]>
Java Persistence with Hibernate, Second Edition<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition<http://www.manning.com/tahchiev/>
Spring Batch in Action<http://www.manning.com/templier/>
Blog: <http://garygregory.wordpress.com/> http://garygregory.wordpress.com
Home: <http://garygregory.com/> http://garygregory.com/
Tweet! <http://twitter.com/GaryGregory> http://twitter.com/GaryGregory


--
Matt Sicker <<mailto:[email protected]>[email protected]<mailto:[email protected]>>



--
E-Mail: <mailto:[email protected]> 
[email protected]<mailto:[email protected]> | 
<mailto:[email protected]> [email protected]<mailto:[email protected]>
Java Persistence with Hibernate, Second Edition<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition<http://www.manning.com/tahchiev/>
Spring Batch in Action<http://www.manning.com/templier/>
Blog: <http://garygregory.wordpress.com/> http://garygregory.wordpress.com
Home: <http://garygregory.com/> http://garygregory.com/
Tweet! <http://twitter.com/GaryGregory> http://twitter.com/GaryGregory



--
E-Mail: <mailto:[email protected]> 
[email protected]<mailto:[email protected]> | 
<mailto:[email protected]> [email protected]<mailto:[email protected]>
Java Persistence with Hibernate, Second Edition<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition<http://www.manning.com/tahchiev/>
Spring Batch in Action<http://www.manning.com/templier/>
Blog: <http://garygregory.wordpress.com/> http://garygregory.wordpress.com
Home: <http://garygregory.com/> http://garygregory.com/
Tweet! <http://twitter.com/GaryGregory> http://twitter.com/GaryGregory



--
Regards,
Sampath



--
E-Mail: <mailto:[email protected]> 
[email protected]<mailto:[email protected]> | 
<mailto:[email protected]> [email protected]<mailto:[email protected]>
Java Persistence with Hibernate, Second Edition<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition<http://www.manning.com/tahchiev/>
Spring Batch in Action<http://www.manning.com/templier/>
Blog: <http://garygregory.wordpress.com/> http://garygregory.wordpress.com
Home: <http://garygregory.com/> http://garygregory.com/
Tweet! <http://twitter.com/GaryGregory> http://twitter.com/GaryGregory



--
Regards,
Sampath



--


Mikael Ståldal
Senior software developer

Magine TV
<mailto:[email protected]>[email protected]<mailto:[email protected]>
Grev Turegatan 3  | 114 46 Stockholm, Sweden  |   <http://www.magine.com/> 
www.magine.com<http://www.magine.com>

Privileged and/or Confidential Information may be contained in this message. If 
you are not the addressee indicated in this message
(or responsible for delivery of the message to such a person), you may not copy 
or deliver this message to anyone. In such case,
you should destroy this message and kindly notify the sender by reply email.



--


Mikael Ståldal
Senior software developer

Magine TV
<mailto:[email protected]>[email protected]<mailto:[email protected]>
Grev Turegatan 3  | 114 46 Stockholm, Sweden  |   <http://www.magine.com/> 
www.magine.com<http://www.magine.com>

Privileged and/or Confidential Information may be contained in this message. If 
you are not the addressee indicated in this message
(or responsible for delivery of the message to such a person), you may not copy 
or deliver this message to anyone. In such case,
you should destroy this message and kindly notify the sender by reply email.



--
E-Mail: [email protected]<mailto:[email protected]> | 
<mailto:[email protected]> [email protected]<mailto:[email protected]>
Java Persistence with Hibernate, Second Edition<http://www.manning.com/bauer3/>
JUnit in Action, Second Edition<http://www.manning.com/tahchiev/>
Spring Batch in Action<http://www.manning.com/templier/>
Blog: http://garygregory.wordpress.com<http://garygregory.wordpress.com/>
Home: http://garygregory.com/
Tweet! http://twitter.com/GaryGregory



--
Matt Sicker <<mailto:[email protected]>[email protected]<mailto:[email protected]>>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to