Friday

String literal && String pool


/*  String object created with using new() operator.
    This always create a new object in heap memory.
    At the below, object and object2 have different references.
*/
String object = new String("Eda"); 
String object2 = new String("Eda"); 
System.out.println(object == object2); // false

/* String object created with using String literal syntax.
   If an object exists in string pool then returns it. Otherwise, creates a new string object and puts into string pool.
   At the below, literal and literal2 have the same reference.
*/
String literal = "Eda";
String literal2 = "Eda";
System.out.println(literal == literal2); // true

NOTE: While comparing two string, we can't know which string parameter has created with new() or literal. So use always equals().

Strings which has created with literal syntax, is cached. This cache is known as "String pool".

If an object exists in string pool then returns it. Otherwise, creates a new string object and puts into string pool. This is called as "interning".
     Interning can be manually, as follows.
          -manually intern in Java 6 is not a good practice. Just because pool has a fixed memory.

String literal = "Eda";
String object = new String("Eda"); 
String internedObject = object.intern();
System.out.println(literal == internedObject); // true

Just before java 7, that cache was in PermGen space. With java 7, it is in heap space.
     permgen space >> has fixed size && can not expanded at runtime, you had to change JVM option(-XX:MaxPermSize=1G) && risk of getting OutOfMemory error.
     heap space >> unreferenced strings has removed from pool && it is garbage collected which means strings with no references  will gone.

There is more JVM options for pool sizing: (your pool size should be high enough)
-XX:StringTableSize=4901 //The default pool size is: 1009 to the Java7u40, after that 60013, alsa java 8 is the same. 
-XX:+PrintStringTableStatistics //print string pool usage statistics when the program finish execution

Wednesday

Some advices on using Optional

//DON'T
Optional<User> user = null;
//DO
Optional<User> user =  Optional.empty();

//Don't confuse Optional.of() and Optional.ofNullable(). Choose the right one.

//DON'T
return Optional.ofNullable("EDA");
//DO
return Optional.of("EDA"); //no risk for NPE of using of() method so choose this.

//DON'T
String parameterToMethod = ...; // can be null
return Optional.of(parameterToMethod);//can throw NPE if parameter is null
//DO
String parameterToMethod = ...; // can be null
return Optional.ofNullable(parameterToMethod);//no risk for NPE

//DON'T
String userName = ... ;
return Optional.ofNullable(userName).orElse("EDA");
//DO
String userName = ... ;
return userName == null ? "EDA" : userName; // choose always the simplest one for such easy cases

//DON'T
Optional<String> user = ...; //can be empty
String myUser = user.get(); // can throw NoSuchElementException if user is empty
//DO
Optional<String> user = ...; //can be empty
if(user.isPresent()) {
 String myUser = user.get();
}


//DON'T
Optional<String> userName = ...;
if(userName.isPresent()) {
   return userName.get();
} else {
   return "Unknown person";
}
//DO
Optional<String> userName = ...;
return userName.orElse("Unknown person");

// DON'T
Optional<String> parameterUserName = ... ;
Optional<String> userName = Optional.of("EDA");
if(parameterUserName.isPresent()) {
 return parameterUserName;
} else {
 return userName;
}
//DO
Optional<String> parameterUserName = ... ;
Optional<String> userName = Optional.of("EDA");
return parameterUserName.or(() -> userName); // with java 9

// DON'T
Optional<String> userName = ... ;
if(userName.isPresent()) {
    System.out.println("userName: " + userName.get());
} else {
    System.out.println("User not found");
}
//DO - java 9
Optional<String> userName = ... ;
userName.ifPresentOrElse(
    System::out::println, 
    () -> System.out.println("User not found")
};

//DON'T
Optional<String> userName = ...;
if (userName.isPresent()) {
    System.out.println("userName: " + userName.get());
}
//DO
Optional<String> userName = ...;
userName.ifPresent(System.out::println);

//DON'T
Optional<String> userName = ...;
if(userName.isPresent()) {
 return userName.get();
} else {
 throw new NoSuchElementException(); 
}
//DO
Optional<String> userName = ...;
return userName.orElseThrow(); //java 10
return userName.orElseThrow(YourException::new);//java 8-9 

//DON'T
 .......
 .filter(Optional::isPresent)
        .map(Optional::get)
 .collect(toList());
//DO
 .......
 .flatMap(Optional::stream)
 .collect(toList());

// AVOID
Optional<Integer> opt = Optional.of(10);
Optional<Long> opt = Optional.of(20L);
Optional<Double> opt = Optional.of(20.53d);

// PREFER
OptionalInt opt = OptionalInt.of(10);           // opt.getAsInt()
OptionalLong opt = OptionalLong.of(20L);        // opt.getAsLong()
OptionalDouble opt = OptionalDouble.of(20.53d); // opt.getAsDouble()

Monday

Optional in java 8 & 9

I'll try to give example for Optional class which has came up for NullPointerException. It is a wrapper class, it can contain any other Object or it can be empty. Java 8 features:

Create Optional instances:
//You can create an empty Optional instance.
Optional.empty();
 
//of() method will throw NullPointerException if the user is null
//you should use of() method only if you are sure that your object is not null
Optional<User> opt = Optional.of(user);

//ofNullable() method can be use if the user object is null or not null.
Optional<User> opt = Optional.ofNullable(user);

Retrieve the actual object inside Optional instance:
//you can use get() method but if the user object is null then it will throw NoSuchElementException.
Optional<User> opt = Optional.ofNullable(user);
User myUser = opt.get();

//so, you should first check the value is present or not
//isPresent() method can be use
Optional<User> opt = Optional.ofNullable(user);
if(opt.isPresent()) {
 User myUser = opt.get();
 //your other jobs
}

//There is also ifPresent() method which combines isPresent() and get()
//lambda expression is used
Optional<User> opt = Optional.ofNullable(user);
opt.ifPresent(myUser -> {
    ///your other jobs
})

Return values:
//orElse() method returns the values if it's present, if not present then returns the other argument
//if user is not null then returns it. Otherwise returns user2.
User myUser = Optional.ofNullable(user).orElse(user2);


//orElseGet() method returns the values if it's present,
//if not present then executes Supplier interface
User myUser = Optional.ofNullable(user).orElseGet( () -> user2);

Lets see the difference between orElse() and orElseGet().
In the following example object is null and both return the other object. There is no difference as you see but....
User user = null; 
System.out.log("orElse>> ");
User myUser = Optional.ofNullable(user).orElse(createUser());
System.out.log(myUser.getName());
System.out.log("orElseGet>> ");
User myUser = Optional.ofNullable(user).orElseGet( () -> createUser());
System.out.log(myUser.getName());

...
private User createUser() {
    logger.debug("createUser method inside");
    return new User("eda2");
}

/*
 Output:
  orElse>>
  createUser method inside
  eda2
  orElseGet>>
  createUser method inside
  eda2
*/

In the following example object is not null.
But even if object is not null orElse() method has gone createUser() method.
orElse() always will call the given function() but orElseGet() will call only if optional is not present.
So orElse() is very expensive for the resources!!!!!!
User user = new User("eda"); 
System.out.log("orElse>> ");
User myUser = Optional.ofNullable(user).orElse(createUser());
System.out.log(myUser.getName());
System.out.log("orElseGet>> ");
User myUser = Optional.ofNullable(user).orElseGet( () -> createUser());
System.out.log(myUser.getName());

...
private User createUser() {
    logger.debug("createUser method inside");
    return new User("eda2");
}

/*
 Output:
  orElse>>
  createUser method inside
  eda
  orElseGet>>
  eda
*/

Return exception:
//orElseThrow() throws an exception if the object is empty:
User myUser = Optional.ofNullable(user).orElseThrow(() -> new UserDoesNotExist());

Mapping:
//map() method applies the functional argument to the value and returns the result.
User user = new User("eda"); 
String userName = Optional.ofNullable(user)
 .map(myUser -> myUser.getName()).orElse("DEFAULT NAME");

//if the get method returns an Optional value you can use flatMap() and return unwrapped String value.
public class User {    
    private String name;

    public Optional<String> getName() {
        return Optional.ofNullable(name);
    }

}

User user = new User("eda");
String userName = Optional.ofNullable(user)
 .flatMap(myUser -> myUser.getName()).orElse("DEFAULT NAME");

Filtering:
//filter() method
//optUser will not contain a null name value.
User user = new User(null);
Optional<User> optUser = Optional.ofNullable(user)
  .filter(myUser -> myUser.getName() != null);

//optUser.isPresent() is false, in this case filter returns empty Optional.

Features that come with Java 9 to Optional class:
Java 9 added 3 more methods to the Optional class:  or(), ifPresentOrElse() and stream().
or() method:
//orElse() and orElseGet() methods returns unwrapped values.
//or() method is similar with them but it returns Optional object.
User user = "eda"; 
Optional<User> myUser = Optional.ofNullable(user).or(() -> createUser());
//User myUser = Optional.ofNullable(user).or(() -> createUser()).get();
System.out.log(myUser.get().getName());
System.out.log("**");
...

User user = null; 
Optional<User> myUser = Optional.ofNullable(user).or(() -> createUser());
System.out.log(myUser.get().getName());
...

private Optional<User>  createUser() {
    logger.debug("createUser method inside");
    return Optional.of(new User("eda2"));
}

/*
 Output:
  eda
  **
  createUser method inside
  eda2
*/

ifPresentOrElse() method:
It gives us a change to run a function if the optional is empty.
Optional<User> opt = Optional.ofNullable(user);
opt.ifPresentOrElse(myUser -> 
    ///your other jobs, myUser.getName()
 , () -> logger.info("User not found")
);

stream() method:
I'll mention about stream in an another writing.
User user = new User("eda");
List<String> nameList = Optional.ofNullable(user)
   .stream()
   .filter(u -> u.getName() != null)
   .map(u -> u.getName())
   .collect(Collectors.toList());

Wednesday

Handling AJAX call error on client side

Just put the below code snippet to a JS file as below. (I used  immediately invoked functional expressions)

It is an error listener, it is called when JSF ajax request/response cyle gets an error.
(function jsfAjaxErrorHandler() {
 jsf.ajax.addOnError(function(data) {
   var log = "status:" +  data.status;
   log += " <br> message:" + data.message;
   log += " <br> description:" + data.description;
   log += " <br> serverErrorName:" + data.serverErrorName;
   log += " <br> serverErrorMessage:" + data.serverErrorMessage;
   log += " <br> source:" + data.source;
   log += " <br> responseCode:" + data.responseCode;
   log += " <br> responseText:" + data.responseText;
   log += " <br> responseXML:" + data.responseXML;
   
   alert(log);
 });
})();

Then load your js file but your js file must be loaded after JSF's own 'jsf.js' file.
<h:outputScript library="javax.faces" name="jsf.js"/>
<h:outputScript name="/yours.js" library="js"/>