views:

837

answers:

4

Is it even possible?

+8  A: 

if you mean an anonymous function then in a word, no.

however, you can implement an interface with a function like so :

Comparator<String> c = new Comparator<String>() {
    int compare(String s, String s2) { ... }
};

and you can use this with inner classes to get an almost-anonymous function :)

oedo
Not yet. In Java 7 it is going to be possible: http://stackoverflow.com/questions/233579/closures-in-java-7
Ilya Boyandin
In the meantime, while waiting for JDK7, anonymous methods can be emulated in an OO context using http://en.wikipedia.org/wiki/Command_pattern
gpampara
+6  A: 

Here's an example of an anonymous inner class.

    System.out.println(new Object() {
        @Override public String toString() {
            return "Hello world!";
        }
    }); // prints "Hello world!"

This is not very useful as it is, but it shows how to create an instance of an anonymous inner class that extends Object and @Override its toString() method.

See also


Anonymous inner classes are very handy when you need to implement an interface which may not be highly reusable (and therefore not worth refactoring to its own named class). An instructive example is using a custom java.util.Comparator<T> for sorting.

Here's an example of how you can sort a String[] based on String.length().

    import java.util.*;
    //...

    String[] arr = { "xxx", "cd", "ab", "z" };
    Arrays.sort(arr, new Comparator<String>() {
        @Override public int compare(String s1, String s2) {
            return s1.length() - s2.length();
        }           
    });
    System.out.println(Arrays.toString(arr));
    // prints "[z, cd, ab, xxx]"

Note the comparison-by-subtraction trick used here. It should be said that this technique is broken in general: it's only applicable when you can guarantee that it will not overflow (such is the case with String lengths).

See also

polygenelubricants
The majority of another occurences can be found as [`EventListener`](http://java.sun.com/javase/6/docs/api/java/util/EventListener.html) (sub)implementations in the average Swing application.
BalusC
@BalusC: added link to question "how are they used"
polygenelubricants
I'm not sure how comparison-by-substraction issue is relevant here...
BalusC
@BalusC: stackoverflow recently added the `Linked` sidebar, so I'm doing my best to make use of it.
polygenelubricants
+4  A: 

Anonymous inner classes implementing or extending the interface of an existing type has been done in other answers, although it is worth noting that multiple methods can be implemented (often with JavaBean-style events, for instance).

A little recognised feature is that although anonymous inner classes don't have a name, they do have a type. New methods can be added to the interface. These methods can only be invoked in limited cases. Chiefly directly on the new expression itself and within the class (including instance initialisers). It might confuse beginners, but it can be "interesting" for recursion.

private static String pretty(Node node) {
    return "Node: " + new Object() {
        String print(Node cur) {
            return cur.isTerminal() ?
                cur.name() :
                ("("+print(cur.left())+":"+print(cur.right())+")");
        }
    }.print(node);
}

(I originally wrote this using node rather than cur in the print method. Say NO to capturing "implicitly final" locals?)

Tom Hawtin - tackline
`node` should be declared `final` here.
BalusC
@BalusC Nice catch. Actually my mistake was not to use `cur`.
Tom Hawtin - tackline
@Tom: +1 nice technique! Is it actually used anywhere in practice? Any name for this specific pattern?
polygenelubricants
@polygenelubricants Not as far as I know. Costs a whole extra object! (And a class.) Much the same was true of the double brace idiom. Right thinking people don't seem to mind the Execute Around idiom.
Tom Hawtin - tackline
@polygenelubricants Actually I don't seem that many (self-contained) recursive algorithms. Particularly those that are not tail-recursive (or easily made so) and cannot be implemented by calling the public method (note the slightly irrelevant `"Node" +` to make a second method necessary). / I don't have a name. Perhaps I could create a naming "poll" (CW) question, and have it downvoted into oblivion.
Tom Hawtin - tackline
Interesting indeed. In real one would normally do this in `Node#toString()` or similar wherein you just call the same method on left and right. I've seen `new SomeObject(){}.someMethod()` as far only on Gson's [`TypeToken`](http://sites.google.com/site/gson/gson-user-guide#TOC-Collections-Examples). But that's not used recursively.
BalusC
@BalusC that requires you to have the algorithm implemented within the hierarchy. This demonstrates an external algorithm (I could have used arrays, say, but that would have introduced a [posh] `for` loop.)
Tom Hawtin - tackline
Yes true. It's kind of an anonymous strategy pattern :)
BalusC
Perhaps it should be called "an anonymous idiom".
Tom Hawtin - tackline
A: 

i seee... so at java we didnt say it as inner function instead... inner object or interface tech... :D

whuaaah! Now I got a bit clear picture from both php n java perspective... :D

gumuruh
this isn't a forum. Either delete this "Answer" or edit it so that it answers the the question that was asked. If you found it helpful then up vote it as well.
DJTripleThreat