久しぶりのJava

既に3年以上Javaは触っておらず、全く忘れてしまっている。
今日、非常勤講師で行っている専門学校の生徒さんがJavaの話をしていたので懐かしくなり横やりを入れたところLL脳になってしまっている自分を発見した :-(

電卓的に随時入力されてくる数値と演算子を使って計算するのに、どのような実装方法がスマートかという話。
その場での結論的には「演算子が入力されたタイミングで演算かけておけばいいのでは?」と。まんま電卓的に。

しかし、その間頭から離れなかったのが「Javaにはevalないんだっけ??」という疑問。
StringBufferに計算内容を全てつっこみ、最後に「=」を押された段階でevalをかければ言語任せで良い感じと。
ぐぐったところ、やはり同じことを考える人は結構いるようで「java eval に一致する日本語のページ 約 143,000 件中 1 - 10 件目 (0.23 秒) 」という結果。
トップが教えて!gooの「[JAVA]evalで文字列を計算式に!」というあたり….しかも2002年….
「Javaは静的言語だからできね〜よ!!」って至極あたりまえの話だけれども、parseしてgetMethodするとかでできそうな….できるよね??

即答できないあたり、Javaプログラマとしては落ちたなと鬱になりつつもすぐ下に「Java文字列内の式の解釈/演算クラス(Hishidama’s Java-Eval class)」を発見。
やっぱみんな考えるんじゃんと少し救われた気分になりながらクラスを追っていったら、やりたいことに対して結構巨大なライブラリ。

まぁ、外部ライブラリは(なんとなく)今回のケースでは反則だし….という感じで、この記事。
ぴでにょ:javaってeval使えるんだ!( ̄Д ̄;; (javascript呼び出して)|ミニブログ「もごもご」
おぉ、Java6ではそんなことになっているんだ….ってことでsunのドキュメントを読みつつ試してみる。

http://java.sun.com/javase/ja/6/docs/ja/technotes/guides/scripting/programmer_guide/index.html#helloworld を参考に….というか引き写し?

import javax.script.*;
public class EvalTest {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        engine.eval("print(eval('1+2-1+3'))");
    }
}

これですっきりしました :-)

こちらの方(eval - すぱいだー日記。)も似たような悩みをお持ちのようなので1、一応トラックバック打っておきます :-)

  1. 2008.04.07付けの日記なので解決している可能性大ですが…. []

Related posts

Tags:

2 Responses to “久しぶりのJava”

  1. spider-man Says:

    動作確認したこと無いんで分からないんですけど、たぶん javascript と同じ動きするんですよね?
    だとすると単純に計算すると誤差が発生しちゃうんですよね・・・・。
    検索すると結構でかいライブラリがヒットして僕もげんなりしましたけど
    結局、逆ポーランド式に変換して BigDecimal を使って計算するようにしました。
    逆ポーランド式に変換さえ出来ればそれほどでかいライブラリにはならないと思います。

  2. tkskkc Says:

    コメントありがとうございます。

    どうなんでしょうね? > 誤差
    ということで簡単な検証をしてみました。
    0.1を10回足す計算をやってみたところ、0.99999…という結果に。
    それ以上は面倒だったので追いかけてませんが、誤差まで実装されている模様です :-)

    確かに逆ポーランド式にした方が処理しやすいですね。

Leave a Reply