5

在 C 中,我可以在函数中创建静态变量。该变量的空间不与函数变量一起分配,它是在程序启动时分配的。(不要太苛刻地嘲笑我的 C,我已经用 Java 编程太久了:)

void myFunc(){
  static SomeStruct someStruct;
  someStruct.state=INITIALIZED;
  goDoSomethingInteresting(MY_COMMAND,&someStruct);
}

在 Java 中,如果我想做类似的事情,我会创建一个类变量然后使用它。

Class TheClass {
   SomeStruct someStruct = new SomeStruct();
   void myFunc(){
     someStruct.setState(INITIALIZED);
     goDoSomethingInteresting(MY_COMMAND,someStruct);
   }
}

我的问题是做这样的事情的最佳做法是什么?我真的很想将我的变量someStruct与我的函数关联起来myFunc,因为myFunc它是唯一应该知道或使用的代码someStruct,但是除了将变量放在代码中的函数附近之外,没有办法建立这种关联。如果你把它放在上面,那么函数的 Javadoc 看起来很不稳定,如果你把它放在下面,那么它们是否属于一起就不是很清楚了。

通常我只会在someStruct本地创建,但在我的情况下创建非常昂贵someStruct,而且我myFunc会在一个紧密的循环中调用。

4

5 回答 5

5

一个小类将someStruct与 cleanly 的行为相关联myFunc,但它是理解和维护事物的额外开销。可能值得,也可能不值得。

class TheClass {
   MyFuncBehavior myFuncer = new MyFuncBehavior();
   void myFunc() {
      myFuncer.myFunc();
   }
}

class MyFuncBehavior {
   private static SomeStruct someStruct = new SomeStruct();

   public void myFunc() {
     someStruct.setState(INITIALIZED);
     goDoSomethingInteresting(MY_COMMAND,someStruct);
   }
}
于 2012-04-17T20:36:20.963 回答
2

由于您正在编写 java 类,因此只需将其设为类的私有成员。如果您想阻止可能正在处理同一文件的其他人在文件的其他地方使用它,请在它旁边添加评论。

于 2012-04-17T20:29:21.317 回答
2

在 C 中function static variable

  • 拥有程序的生命
  • 具有功能范围

也就是说,一旦初始化,它在每次调用函数时都可用,并分配给它的最后一个值,但在函数外部无法访问。

如果您将函数转换为具有一种方法的类并使静态变量成为该类的成员,这将非常适合。

例如

void F()
{
   static int i;
}

变成

class F
{
    int i;
    func() ....
}
于 2012-04-17T20:46:50.060 回答
0

我认为尝试在单个源文件(即一个类及其所有内部类)中强制封装没有多大意义,Java 似乎遵循这一原则。

任何有权访问源代码的人都可以更改它以访问任何字段。

但是,重新设计代码是一种选择:

  1. myFunc()您可以连同它使用的字段一起 提取到一个单独的类中。
  2. 您可以简单地将方法的签名更改为void myFunc( SomeStruct struct)并将其作为参数传递。将其存储为调用者的局部变量。

如果循环确实非常紧密,那么开销将是最小的。(就我个人而言,我不会做上述任何事情。)

于 2012-04-17T20:25:48.127 回答
0

在 Java 中,如果我想做类似的事情,我会创建一个类变量然后使用它。

是的,这是最佳做法。

于 2012-04-17T20:27:50.653 回答