Re: [POOL2] Pooling mutable objects

2015-02-06 Thread William Speirs
I'd think adding a UUID then overriding equals and hashCode would do the
trick. To aid you in doing this, commons-lang has EqualsBuilder [1] and
HashCodeBuilder [2], I highly recommend using them.

Bill-


[1]
https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/EqualsBuilder.html

[2]
https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/HashCodeBuilder.html

On Fri, Feb 6, 2015 at 9:00 AM, Michael Osipov 1983-01...@gmx.net wrote:

 Hi folks,

 I am developing a session pool for an HTTP backend which is requested with
 the fabulous HttpClient.

 The session object is this:

 public class RawSession {

 private CookieStore cookieStore;
 private String logId;
 private MutableInt requestId;
 private String clientId;
 private String serverId;

 }

 There won't be any setters but as you see, the cookie store and mutable
 int might change.
 Additionally, I did not implement any custom equals and hashCode methods.

 I have searched the docs and the found and did not find any clear answer
 which says
 that pooled objects have to be immutable. Though, I have found POOL-283
 and POOL-284 which
 led me to the conclusion that this is a problem because the objects are
 stored in a map
 which relies on equals and hashCode.

 Does this ultimately mean that I have to override equals and hashCode and
 provide some internal,
 immutable value something like a UUID? Alternatively, I could retrieve the
 JSESSIONID from the
 cookie store and use this as a unique value.

 Thanks,

 Michael

 -
 To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
 For additional commands, e-mail: user-h...@commons.apache.org




Re: Re: [POOL2] Pooling mutable objects

2015-02-06 Thread Michael Osipov
This is what I did:
this.internalId = RandomStringUtils.randomAlphanumeric(8);

Some Eclipse magic:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((internalId == null) ? 0 : 
internalId.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RawSession other = (RawSession) obj;
if (internalId == null) {
if (other.internalId != null)
return false;
} else if (!internalId.equals(other.internalId))
return false;
return true;
}

 Gesendet: Freitag, 06. Februar 2015 um 16:47 Uhr
 Von: James Carman ja...@carmanconsulting.com
 An: Commons Users List user@commons.apache.org
 Betreff: Re: [POOL2] Pooling mutable objects

 Or just let your IDE generate the methods.
 
 
 On Fri, Feb 6, 2015 at 9:05 AM, William Speirs wspe...@apache.org wrote:
  I'd think adding a UUID then overriding equals and hashCode would do the
  trick. To aid you in doing this, commons-lang has EqualsBuilder [1] and
  HashCodeBuilder [2], I highly recommend using them.
 
  Bill-
 
 
  [1]
  https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/EqualsBuilder.html
 
  [2]
  https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/HashCodeBuilder.html
 
  On Fri, Feb 6, 2015 at 9:00 AM, Michael Osipov 1983-01...@gmx.net wrote:
 
  Hi folks,
 
  I am developing a session pool for an HTTP backend which is requested with
  the fabulous HttpClient.
 
  The session object is this:
 
  public class RawSession {
 
  private CookieStore cookieStore;
  private String logId;
  private MutableInt requestId;
  private String clientId;
  private String serverId;
 
  }
 
  There won't be any setters but as you see, the cookie store and mutable
  int might change.
  Additionally, I did not implement any custom equals and hashCode methods.
 
  I have searched the docs and the found and did not find any clear answer
  which says
  that pooled objects have to be immutable. Though, I have found POOL-283
  and POOL-284 which
  led me to the conclusion that this is a problem because the objects are
  stored in a map
  which relies on equals and hashCode.
 
  Does this ultimately mean that I have to override equals and hashCode and
  provide some internal,
  immutable value something like a UUID? Alternatively, I could retrieve the
  JSESSIONID from the
  cookie store and use this as a unique value.
 
  Thanks,
 
  Michael
 
  -
  To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
  For additional commands, e-mail: user-h...@commons.apache.org
 
 
 
 -
 To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
 For additional commands, e-mail: user-h...@commons.apache.org
 
 

-
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org



Re: [POOL2] Pooling mutable objects

2015-02-06 Thread James Carman
Or just let your IDE generate the methods.


On Fri, Feb 6, 2015 at 9:05 AM, William Speirs wspe...@apache.org wrote:
 I'd think adding a UUID then overriding equals and hashCode would do the
 trick. To aid you in doing this, commons-lang has EqualsBuilder [1] and
 HashCodeBuilder [2], I highly recommend using them.

 Bill-


 [1]
 https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/EqualsBuilder.html

 [2]
 https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/HashCodeBuilder.html

 On Fri, Feb 6, 2015 at 9:00 AM, Michael Osipov 1983-01...@gmx.net wrote:

 Hi folks,

 I am developing a session pool for an HTTP backend which is requested with
 the fabulous HttpClient.

 The session object is this:

 public class RawSession {

 private CookieStore cookieStore;
 private String logId;
 private MutableInt requestId;
 private String clientId;
 private String serverId;

 }

 There won't be any setters but as you see, the cookie store and mutable
 int might change.
 Additionally, I did not implement any custom equals and hashCode methods.

 I have searched the docs and the found and did not find any clear answer
 which says
 that pooled objects have to be immutable. Though, I have found POOL-283
 and POOL-284 which
 led me to the conclusion that this is a problem because the objects are
 stored in a map
 which relies on equals and hashCode.

 Does this ultimately mean that I have to override equals and hashCode and
 provide some internal,
 immutable value something like a UUID? Alternatively, I could retrieve the
 JSESSIONID from the
 cookie store and use this as a unique value.

 Thanks,

 Michael

 -
 To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
 For additional commands, e-mail: user-h...@commons.apache.org



-
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org



Re: Re: [POOL2] Pooling mutable objects

2015-02-06 Thread James Carman
Try UUID.randomUUID().toString() rather than RandomStringUtils if you
really want unique keys.

On Fri, Feb 6, 2015 at 10:54 AM, Michael Osipov 1983-01...@gmx.net wrote:
 This is what I did:
 this.internalId = RandomStringUtils.randomAlphanumeric(8);

 Some Eclipse magic:
 @Override
 public int hashCode() {
 final int prime = 31;
 int result = 1;
 result = prime * result + ((internalId == null) ? 0 : 
 internalId.hashCode());
 return result;
 }

 @Override
 public boolean equals(Object obj) {
 if (this == obj)
 return true;
 if (obj == null)
 return false;
 if (getClass() != obj.getClass())
 return false;
 RawSession other = (RawSession) obj;
 if (internalId == null) {
 if (other.internalId != null)
 return false;
 } else if (!internalId.equals(other.internalId))
 return false;
 return true;
 }

 Gesendet: Freitag, 06. Februar 2015 um 16:47 Uhr
 Von: James Carman ja...@carmanconsulting.com
 An: Commons Users List user@commons.apache.org
 Betreff: Re: [POOL2] Pooling mutable objects

 Or just let your IDE generate the methods.


 On Fri, Feb 6, 2015 at 9:05 AM, William Speirs wspe...@apache.org wrote:
  I'd think adding a UUID then overriding equals and hashCode would do the
  trick. To aid you in doing this, commons-lang has EqualsBuilder [1] and
  HashCodeBuilder [2], I highly recommend using them.
 
  Bill-
 
 
  [1]
  https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/EqualsBuilder.html
 
  [2]
  https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/HashCodeBuilder.html
 
  On Fri, Feb 6, 2015 at 9:00 AM, Michael Osipov 1983-01...@gmx.net wrote:
 
  Hi folks,
 
  I am developing a session pool for an HTTP backend which is requested with
  the fabulous HttpClient.
 
  The session object is this:
 
  public class RawSession {
 
  private CookieStore cookieStore;
  private String logId;
  private MutableInt requestId;
  private String clientId;
  private String serverId;
 
  }
 
  There won't be any setters but as you see, the cookie store and mutable
  int might change.
  Additionally, I did not implement any custom equals and hashCode methods.
 
  I have searched the docs and the found and did not find any clear answer
  which says
  that pooled objects have to be immutable. Though, I have found POOL-283
  and POOL-284 which
  led me to the conclusion that this is a problem because the objects are
  stored in a map
  which relies on equals and hashCode.
 
  Does this ultimately mean that I have to override equals and hashCode and
  provide some internal,
  immutable value something like a UUID? Alternatively, I could retrieve the
  JSESSIONID from the
  cookie store and use this as a unique value.
 
  Thanks,
 
  Michael
 
  -
  To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
  For additional commands, e-mail: user-h...@commons.apache.org
 
 

 -
 To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
 For additional commands, e-mail: user-h...@commons.apache.org



 -
 To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
 For additional commands, e-mail: user-h...@commons.apache.org


-
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org



Re: Re: [POOL2] Pooling mutable objects

2015-02-06 Thread William Speirs
I'm not sure I understand your comment Mat. From what I can tell, Michael
made his own hash function. That's fine, but *might* have unexpected
collision issues. Might not too... I don't know. My guess though is that
he's not an expert (who is an expert on hash functions?) and might
unknowingly fall into a trap here.

For example, commons-lang HashBuilder uses 37 as the prime and 17 as the
initial result... Michael didn't. Maybe he's OK, maybe he's not... but why
risk it? Why not just use the library and not reinvent the wheel? (Most
valid reason would be not wanting to pull in a whole library for these two
functions/classes.)

Again, take my advice for what you paid, nothing. :-)

Bill-

On Fri, Feb 6, 2015 at 11:06 AM, Mat Jaggard matt...@jaggard.org.uk wrote:

 William - I'm not sure if you noticed, but they didn't hand-make anything.

 On 6 February 2015 at 16:00, William Speirs wspe...@apache.org wrote:

  Why wouldn't you use the HashCodeBuilder? Much simpler:
 
  return new HashCodeBuilder().append(internalId).toHashCode();
 
  Done in 1 line, and probably fewer collisions than your hand-made one.
 Same
  with the EqualsBuilder...
 
  If you don't want the dep on commons-lang, then I can understand... but
 I'd
  just borrow their internal algo.
 
  My $0.02...
 
  Bill-
 
  On Fri, Feb 6, 2015 at 10:54 AM, Michael Osipov 1983-01...@gmx.net
  wrote:
 
   This is what I did:
   this.internalId = RandomStringUtils.randomAlphanumeric(8);
  
   Some Eclipse magic:
   @Override
   public int hashCode() {
   final int prime = 31;
   int result = 1;
   result = prime * result + ((internalId == null) ? 0 :
   internalId.hashCode());
   return result;
   }
  
   @Override
   public boolean equals(Object obj) {
   if (this == obj)
   return true;
   if (obj == null)
   return false;
   if (getClass() != obj.getClass())
   return false;
   RawSession other = (RawSession) obj;
   if (internalId == null) {
   if (other.internalId != null)
   return false;
   } else if (!internalId.equals(other.internalId))
   return false;
   return true;
   }
  
Gesendet: Freitag, 06. Februar 2015 um 16:47 Uhr
Von: James Carman ja...@carmanconsulting.com
An: Commons Users List user@commons.apache.org
Betreff: Re: [POOL2] Pooling mutable objects
   
Or just let your IDE generate the methods.
   
   
On Fri, Feb 6, 2015 at 9:05 AM, William Speirs wspe...@apache.org
   wrote:
 I'd think adding a UUID then overriding equals and hashCode would
 do
   the
 trick. To aid you in doing this, commons-lang has EqualsBuilder [1]
  and
 HashCodeBuilder [2], I highly recommend using them.

 Bill-


 [1]

  
 
 https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/EqualsBuilder.html

 [2]

  
 
 https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/HashCodeBuilder.html

 On Fri, Feb 6, 2015 at 9:00 AM, Michael Osipov 1983-01...@gmx.net
 
   wrote:

 Hi folks,

 I am developing a session pool for an HTTP backend which is
  requested
   with
 the fabulous HttpClient.

 The session object is this:

 public class RawSession {

 private CookieStore cookieStore;
 private String logId;
 private MutableInt requestId;
 private String clientId;
 private String serverId;

 }

 There won't be any setters but as you see, the cookie store and
   mutable
 int might change.
 Additionally, I did not implement any custom equals and hashCode
   methods.

 I have searched the docs and the found and did not find any clear
   answer
 which says
 that pooled objects have to be immutable. Though, I have found
   POOL-283
 and POOL-284 which
 led me to the conclusion that this is a problem because the
 objects
   are
 stored in a map
 which relies on equals and hashCode.

 Does this ultimately mean that I have to override equals and
  hashCode
   and
 provide some internal,
 immutable value something like a UUID? Alternatively, I could
   retrieve the
 JSESSIONID from the
 cookie store and use this as a unique value.

 Thanks,

 Michael


  -
 To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
 For additional commands, e-mail: user-h...@commons.apache.org


   
-
To 

Re: Re: [POOL2] Pooling mutable objects

2015-02-06 Thread Mat Jaggard
He didn't create his own hash function, he generated it in eclipse. This is
better because you get all the testing of other eclipse users without any
runtime dependencies.

On 6 February 2015 at 16:16, William Speirs wspe...@apache.org wrote:

 I'm not sure I understand your comment Mat. From what I can tell, Michael
 made his own hash function. That's fine, but *might* have unexpected
 collision issues. Might not too... I don't know. My guess though is that
 he's not an expert (who is an expert on hash functions?) and might
 unknowingly fall into a trap here.

 For example, commons-lang HashBuilder uses 37 as the prime and 17 as the
 initial result... Michael didn't. Maybe he's OK, maybe he's not... but why
 risk it? Why not just use the library and not reinvent the wheel? (Most
 valid reason would be not wanting to pull in a whole library for these two
 functions/classes.)

 Again, take my advice for what you paid, nothing. :-)

 Bill-

 On Fri, Feb 6, 2015 at 11:06 AM, Mat Jaggard matt...@jaggard.org.uk
 wrote:

  William - I'm not sure if you noticed, but they didn't hand-make
 anything.
 
  On 6 February 2015 at 16:00, William Speirs wspe...@apache.org wrote:
 
   Why wouldn't you use the HashCodeBuilder? Much simpler:
  
   return new HashCodeBuilder().append(internalId).toHashCode();
  
   Done in 1 line, and probably fewer collisions than your hand-made one.
  Same
   with the EqualsBuilder...
  
   If you don't want the dep on commons-lang, then I can understand... but
  I'd
   just borrow their internal algo.
  
   My $0.02...
  
   Bill-
  
   On Fri, Feb 6, 2015 at 10:54 AM, Michael Osipov 1983-01...@gmx.net
   wrote:
  
This is what I did:
this.internalId = RandomStringUtils.randomAlphanumeric(8);
   
Some Eclipse magic:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((internalId == null) ? 0 :
internalId.hashCode());
return result;
}
   
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RawSession other = (RawSession) obj;
if (internalId == null) {
if (other.internalId != null)
return false;
} else if (!internalId.equals(other.internalId))
return false;
return true;
}
   
 Gesendet: Freitag, 06. Februar 2015 um 16:47 Uhr
 Von: James Carman ja...@carmanconsulting.com
 An: Commons Users List user@commons.apache.org
 Betreff: Re: [POOL2] Pooling mutable objects

 Or just let your IDE generate the methods.


 On Fri, Feb 6, 2015 at 9:05 AM, William Speirs wspe...@apache.org
 
wrote:
  I'd think adding a UUID then overriding equals and hashCode would
  do
the
  trick. To aid you in doing this, commons-lang has EqualsBuilder
 [1]
   and
  HashCodeBuilder [2], I highly recommend using them.
 
  Bill-
 
 
  [1]
 
   
  
 
 https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/EqualsBuilder.html
 
  [2]
 
   
  
 
 https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/HashCodeBuilder.html
 
  On Fri, Feb 6, 2015 at 9:00 AM, Michael Osipov 
 1983-01...@gmx.net
  
wrote:
 
  Hi folks,
 
  I am developing a session pool for an HTTP backend which is
   requested
with
  the fabulous HttpClient.
 
  The session object is this:
 
  public class RawSession {
 
  private CookieStore cookieStore;
  private String logId;
  private MutableInt requestId;
  private String clientId;
  private String serverId;
 
  }
 
  There won't be any setters but as you see, the cookie store and
mutable
  int might change.
  Additionally, I did not implement any custom equals and hashCode
methods.
 
  I have searched the docs and the found and did not find any
 clear
answer
  which says
  that pooled objects have to be immutable. Though, I have found
POOL-283
  and POOL-284 which
  led me to the conclusion that this is a problem because the
  objects
are
  stored in a map
  which relies on equals and hashCode.
 
  Does this ultimately mean that I have to override equals and
   hashCode
and
  provide some internal,
  immutable value something like a UUID? Alternatively, I could
retrieve the
  JSESSIONID from the

Re: Re: [POOL2] Pooling mutable objects

2015-02-06 Thread sebb
The existing Pool2 implementations use equals() to decide if two
objects are the same.

You have to make sure that your equals() implementation returns true
if and only if the objects being compared are the same as far as your
use of them is concerned.
So for example two Integers are equal if they have the same integral
value, but two different StringBuffer instances are never equal.

Once you have determined what constitutes equality for your instances,
make sure that the hash code is coded accordingly, i.e. two objects
that are equal() must have the same hash code.
If this requirment is not met, then the HashMap used internally by
Pool2 will behave unpredictably.

If all RawSession instances are to be regarded as unique (which seems
likely), then define equals and hash code as noted in POOL-283:

https://issues.apache.org/jira/browse/POOL-283?focusedCommentId=14307637page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14307637


On 6 February 2015 at 16:34, Mat Jaggard matt...@jaggard.org.uk wrote:
 He didn't create his own hash function, he generated it in eclipse. This is
 better because you get all the testing of other eclipse users without any
 runtime dependencies.

 On 6 February 2015 at 16:16, William Speirs wspe...@apache.org wrote:

 I'm not sure I understand your comment Mat. From what I can tell, Michael
 made his own hash function. That's fine, but *might* have unexpected
 collision issues. Might not too... I don't know. My guess though is that
 he's not an expert (who is an expert on hash functions?) and might
 unknowingly fall into a trap here.

 For example, commons-lang HashBuilder uses 37 as the prime and 17 as the
 initial result... Michael didn't. Maybe he's OK, maybe he's not... but why
 risk it? Why not just use the library and not reinvent the wheel? (Most
 valid reason would be not wanting to pull in a whole library for these two
 functions/classes.)

 Again, take my advice for what you paid, nothing. :-)

 Bill-

 On Fri, Feb 6, 2015 at 11:06 AM, Mat Jaggard matt...@jaggard.org.uk
 wrote:

  William - I'm not sure if you noticed, but they didn't hand-make
 anything.
 
  On 6 February 2015 at 16:00, William Speirs wspe...@apache.org wrote:
 
   Why wouldn't you use the HashCodeBuilder? Much simpler:
  
   return new HashCodeBuilder().append(internalId).toHashCode();
  
   Done in 1 line, and probably fewer collisions than your hand-made one.
  Same
   with the EqualsBuilder...
  
   If you don't want the dep on commons-lang, then I can understand... but
  I'd
   just borrow their internal algo.
  
   My $0.02...
  
   Bill-
  
   On Fri, Feb 6, 2015 at 10:54 AM, Michael Osipov 1983-01...@gmx.net
   wrote:
  
This is what I did:
this.internalId = RandomStringUtils.randomAlphanumeric(8);
   
Some Eclipse magic:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((internalId == null) ? 0 :
internalId.hashCode());
return result;
}
   
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
RawSession other = (RawSession) obj;
if (internalId == null) {
if (other.internalId != null)
return false;
} else if (!internalId.equals(other.internalId))
return false;
return true;
}
   
 Gesendet: Freitag, 06. Februar 2015 um 16:47 Uhr
 Von: James Carman ja...@carmanconsulting.com
 An: Commons Users List user@commons.apache.org
 Betreff: Re: [POOL2] Pooling mutable objects

 Or just let your IDE generate the methods.


 On Fri, Feb 6, 2015 at 9:05 AM, William Speirs wspe...@apache.org
 
wrote:
  I'd think adding a UUID then overriding equals and hashCode would
  do
the
  trick. To aid you in doing this, commons-lang has EqualsBuilder
 [1]
   and
  HashCodeBuilder [2], I highly recommend using them.
 
  Bill-
 
 
  [1]
 
   
  
 
 https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/EqualsBuilder.html
 
  [2]
 
   
  
 
 https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/HashCodeBuilder.html
 
  On Fri, Feb 6, 2015 at 9:00 AM, Michael Osipov 
 1983-01...@gmx.net
  
wrote:
 
  Hi folks,
 
  I am developing a session pool for an HTTP backend which is
   requested
with
  the fabulous HttpClient.
 
  The session object is this:
 
  

[POOL2] Pooling mutable objects

2015-02-06 Thread Michael Osipov
Hi folks,

I am developing a session pool for an HTTP backend which is requested with the 
fabulous HttpClient.

The session object is this:

public class RawSession {

private CookieStore cookieStore;
private String logId;
private MutableInt requestId;
private String clientId;
private String serverId;

}

There won't be any setters but as you see, the cookie store and mutable int 
might change.
Additionally, I did not implement any custom equals and hashCode methods.

I have searched the docs and the found and did not find any clear answer which 
says
that pooled objects have to be immutable. Though, I have found POOL-283 and 
POOL-284 which
led me to the conclusion that this is a problem because the objects are stored 
in a map
which relies on equals and hashCode.

Does this ultimately mean that I have to override equals and hashCode and 
provide some internal,
immutable value something like a UUID? Alternatively, I could retrieve the 
JSESSIONID from the
cookie store and use this as a unique value.

Thanks,

Michael

-
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org



Re: Re: [POOL2] Pooling mutable objects

2015-02-06 Thread Jörg Schaible
Hi William,

William Speirs wrote:

 I'm not sure I understand your comment Mat. From what I can tell, Michael
 made his own hash function. That's fine, but *might* have unexpected
 collision issues. Might not too... I don't know. My guess though is that
 he's not an expert (who is an expert on hash functions?) and might
 unknowingly fall into a trap here.
 
 For example, commons-lang HashBuilder uses 37 as the prime and 17 as the
 initial result... Michael didn't. Maybe he's OK, maybe he's not... but why
 risk it? Why not just use the library and not reinvent the wheel? (Most
 valid reason would be not wanting to pull in a whole library for these two
 functions/classes.)

Maybe because it can be dead-slow?

https://www.mail-archive.com/user@xstream.codehaus.org/msg00677.html

I use HashCodeBuilder and EqualsBilder for Mock objects only ... for good 
reason.

Cheers,
Jörg


-
To unsubscribe, e-mail: user-unsubscr...@commons.apache.org
For additional commands, e-mail: user-h...@commons.apache.org



Re: [POOL2] Pooling mutable objects

2015-02-06 Thread Phil Steitz
On 2/6/15 10:16 AM, sebb wrote:
 The existing Pool2 implementations use equals() to decide if two
 objects are the same.

As of pool 2.3.

 You have to make sure that your equals() implementation returns true
 if and only if the objects being compared are the same as far as your
 use of them is concerned.
 So for example two Integers are equal if they have the same integral
 value, but two different StringBuffer instances are never equal.

 Once you have determined what constitutes equality for your instances,
 make sure that the hash code is coded accordingly, i.e. two objects
 that are equal() must have the same hash code.
 If this requirment is not met, then the HashMap used internally by
 Pool2 will behave unpredictably.

Also, hash codes should not change between the time that an object
is borrowed from the pool and subsequently returned.  Again, for
pool 2.0-2.3 (latest as of this post), objects under management by
the pool are kept in a hashmap keyed on the objects themselves, so
mutability that changes hashcodes (and / or equality) can cause
problems.  See the discussion on POOL-284.

These problems do not impact earlier (1.x) versions of Commons Pool.


 If all RawSession instances are to be regarded as unique (which seems
 likely), then define equals and hash code as noted in POOL-283:

 https://issues.apache.org/jira/browse/POOL-283?focusedCommentId=14307637page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-14307637


 On 6 February 2015 at 16:34, Mat Jaggard matt...@jaggard.org.uk wrote:
 He didn't create his own hash function, he generated it in eclipse. This is
 better because you get all the testing of other eclipse users without any
 runtime dependencies.

 On 6 February 2015 at 16:16, William Speirs wspe...@apache.org wrote:

 I'm not sure I understand your comment Mat. From what I can tell, Michael
 made his own hash function. That's fine, but *might* have unexpected
 collision issues. Might not too... I don't know. My guess though is that
 he's not an expert (who is an expert on hash functions?) and might
 unknowingly fall into a trap here.

 For example, commons-lang HashBuilder uses 37 as the prime and 17 as the
 initial result... Michael didn't. Maybe he's OK, maybe he's not... but why
 risk it? Why not just use the library and not reinvent the wheel? (Most
 valid reason would be not wanting to pull in a whole library for these two
 functions/classes.)

 Again, take my advice for what you paid, nothing. :-)

 Bill-

 On Fri, Feb 6, 2015 at 11:06 AM, Mat Jaggard matt...@jaggard.org.uk
 wrote:

 William - I'm not sure if you noticed, but they didn't hand-make
 anything.
 On 6 February 2015 at 16:00, William Speirs wspe...@apache.org wrote:

 Why wouldn't you use the HashCodeBuilder? Much simpler:

 return new HashCodeBuilder().append(internalId).toHashCode();

 Done in 1 line, and probably fewer collisions than your hand-made one.
 Same
 with the EqualsBuilder...

 If you don't want the dep on commons-lang, then I can understand... but
 I'd
 just borrow their internal algo.

 My $0.02...

 Bill-

 On Fri, Feb 6, 2015 at 10:54 AM, Michael Osipov 1983-01...@gmx.net
 wrote:

 This is what I did:
 this.internalId = RandomStringUtils.randomAlphanumeric(8);

 Some Eclipse magic:
 @Override
 public int hashCode() {
 final int prime = 31;
 int result = 1;
 result = prime * result + ((internalId == null) ? 0 :
 internalId.hashCode());
 return result;
 }

 @Override
 public boolean equals(Object obj) {
 if (this == obj)
 return true;
 if (obj == null)
 return false;
 if (getClass() != obj.getClass())
 return false;
 RawSession other = (RawSession) obj;
 if (internalId == null) {
 if (other.internalId != null)
 return false;
 } else if (!internalId.equals(other.internalId))
 return false;
 return true;
 }

 Gesendet: Freitag, 06. Februar 2015 um 16:47 Uhr
 Von: James Carman ja...@carmanconsulting.com
 An: Commons Users List user@commons.apache.org
 Betreff: Re: [POOL2] Pooling mutable objects

 Or just let your IDE generate the methods.


 On Fri, Feb 6, 2015 at 9:05 AM, William Speirs wspe...@apache.org
 wrote:
 I'd think adding a UUID then overriding equals and hashCode would
 do
 the
 trick. To aid you in doing this, commons-lang has EqualsBuilder
 [1]
 and
 HashCodeBuilder [2], I highly recommend using them.

 Bill-


 [1]

 https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/EqualsBuilder.html
 [2]

 https://commons.apache.org/proper/commons-lang/javadocs/api-3.3.2/org/apache/commons/lang3/builder/HashCodeBuilder.html
 On Fri, Feb 6, 2015 at 9:00 AM, Michael