Sunday, April 11, 2010

Method searches with Class Viewer

Part of the design philosophy of the Class Viewer project is getting the best method you need for a particular object or to return a particular object, where I also like to warn that one problem with that philosophy is that there is a drop in emphasis, oddly enough, in actually memorizing all the methods associated with a class.

Understanding how powerful Class Viewer is in searching for the perfect method is best done by seeing it in action, where my favorite example is to use the String class, which gives the main screenshot for the Class Viewer project, where you need to know what methods take chars or return them. Using Class Viewer now I can copy and paste to show them:

static String valueOf(char[])
static String valueOf(char[],int,int)
static String valueOf(char)
char charAt(int)
boolean contains(CharSequence)
boolean contentEquals(CharSequence)
static String copyValueOf(char[])
static String copyValueOf(char[],int,int)
byte[] getBytes(java.nio.charset.Charset)
void getChars(int,int,char[],int)
static String join(CharSequence,CharSequence[])
static String join(CharSequence,Iterable)
String replace(char,char)
String replace(CharSequence,CharSequence)
CharSequence subSequence(int,int)
char[] toCharArray()

And that's it. Everything that can possibly give or receive a char in the entire String class, so if you're developing and wonder if there is anything else, nope, not in the String class. That's it. And I did a search on "char", highlighting a method that had "char" from the left window of the app.

But hey, there is another class that can handle chars which is StringBuilder, and yes, you DO need to keep up with knowing classes, just not the methods in them, so it pushes you to only know your classes, as you can just pull out which method you need based on what you will hand them, and what you want them to give back to you.

That is key to the design philosophy: what thing do I have that needs to be given to a class and what do I need it to hand back to me?

Now if you open StringBuilder in Class Viewer you may notice--as I did while pondering what to say in this post--that it has a LOT of methods with "String" in them. But let's say I only want methods that receive just a String, here they are:

AbstractStringBuilder append(String)
StringBuilder append(String)
int indexOf(String)
int lastIndexOf(String)

And that's it. There are no other methods (of course I'm only talking public methods) which will take just a String, and how did I achieve the feat of finding them? I did a search on a method in the left window, highlighting "(String)". That's the easy way. To get just those methods using the "Search String" box in Class Viewer you actually have to search on: (java.lang.String)

You can get fancy searches by what you highlight and search on from the left window, like here's a fun one: "String "

It gives:

String toString()
String substring(int)
String substring(int,int)

And those are all the methods in the StringBuilder class that return a String. That one is kind of tricky as I actually highlighted whitespace, which you can only do with searches on the left hand window. But that can be a very powerful tool. So it's important to emphasize that whatever you highlight in the left window is what is searched, even special characters, like whitespace.

But notice if you were wondering how to get a String from StringBuilder those are the only ways.

Curious about any one of them? Then double-click on the method in the right hand window, and you get taken to javadocs. Here's the link that Class Viewer built for me for the third one:

Which is the final piece to helping you get the best method possible as if you have questions you can go directly to javadocs at the method, which I call deep linking.

So the focus is on what you want the class to give you. Or you can focus on what you wish to hand the class and that is where Class Viewer can help you a lot.

Results above valid with Java 8 SDK.

Editorial notes:

9/27/12 Updated built link to go to latest Java SDK. ___JSH
7/08/14 Updated copied searches and built link to go to latest Java SDK. ___JSH