在Ada(2005或2012)中实现相当于java finalize块的最佳实践

cic*_*ron 6 ada finalize

Java有一个finalize块,允许在一个块离开后执行一些语句(即使引发了异常也会执行).例:

try {
  ...
} catch (Exception e) {
  ...
} finally {
  ... // any code here
}
Run Code Online (Sandbox Code Playgroud)

Ada具有允许实现Finalize操作的受控对象,但没有与java中相同的finalize块.这对于记录,关闭文件,事务等非常有用(无需为每个可能的块创建特定的标记类型).

  1. 你将如何在Ada 2005中实现这样的终结块(同时保持代码可读)?
  2. Ada 2012是否有计划允许轻松执行任何终结代码?

Sim*_*ght 2

我相信这段代码会满足您的要求;它成功地打印出42带有presentraise或with 的内容return。这是 TED 建议的实现。

在 Mac OS X、Darwin 10.6.0 上使用 GCC 4.5.0 进行测试。

with Ada.Finalization;
package Finally is

   --  Calls Callee on deletion.
   type Caller (Callee : not null access procedure)
      is new Ada.Finalization.Limited_Controlled with private;

private

   type Caller (Callee : not null access procedure)
      is new Ada.Finalization.Limited_Controlled with null record;

   procedure Finalize (Object : in out Caller);

end Finally;


package body Finally is

   procedure Finalize (Object : in out Caller)
   is
   begin
      Object.Callee.all;
   end Finalize;

end Finally;


with Ada.Text_IO; use Ada.Text_IO;
with Finally;
procedure Finally_Demo is
begin

   declare

      X : Integer := 21;

      --  The cleanup procedure, to be executed when this block is left
      procedure F
      is
      begin
         Put_Line ("X is " & Integer'Image (X));
      end F;

      --  The controlled object, whose deletion will execute F
      F_Caller : Finally.Caller (F'Access);

   begin

      X := 42;

      raise Constraint_Error;

   end;

end Finally_Demo;
Run Code Online (Sandbox Code Playgroud)