構造体

(int,int)⇒
struct point {
  int x,
  int y
}

多値の各項にアクセッサ/識別子を付けると構造体が出来上がる。これも抽象化と言えないこともないのだけれど、データ構造を扱っている点は変わっておらず、極めて具体的な表現に止まっている。これに対し、javaのinterfaceではメソッドの宣言だけを行っており、振る舞いの型を扱っているという点で抽象化がより進んでいると言える。
オブジェクトをその振る舞いだけに抽象化することにより、実装に捕らわれずにアルゴリズムを独立に記述することが可能になる。このようなアルゴリズム中心的な記述を行うためにはjavaのinterfaceだけでは不充分であり、契約プログラミングなどの手法が重要になるだろう。
話を最適化に移せば「問題規模に対して、アルゴリズムの最適化はオーダーで効き、データ構造の最適化はファクターで効く」という単純な事実がある。アルゴリズム設計とデータ構造設計を分離することにより、満足出来る程度まで両者を高めることが容易になるのではないか。*1

*1:実際にはファクター同士の差が重要な例も多いのだが、限界レベルの最適化は*特に*必要な箇所だけで充分だ。