【问题标题】:Local static variables and Java局部静态变量和 Java
【发布时间】:2014-06-13 03:05:20
【问题描述】:

我想知道如何在java中实现局部静态变量。我知道Java不会支持它。但是实现相同目标的更好方法是什么?我不希望我的类中的其他方法访问该变量,但它应该在方法的调用中保留该值。

谁能告诉我。

【问题讨论】:

  • “local”和“static”有些矛盾……但无论如何,只有一个常规的实例变量或其他东西而不是从其他方法访问它有什么问题?
  • “我不希望我的类中的其他方法访问该变量” - 然后不要让他们访问该变量。问题解决了。类中的访问修饰符将是矫枉过正。
  • 是的,stackoverflow.com/a/12274406/217324 这个问题的答案是正确的:使用对象实例来维护状态。

标签: java static static-variables


【解决方案1】:

我认为没有任何方法可以实现这一点。 Java 不支持 C 语言中的“本地静态”,并且无法在保持源代码“真正的 Java”的同时对其进行改进1

我不希望我的类中的其他方法访问该变量,但它应该在方法的调用中保留该值。

最好的办法是将其设为普通(私有)静态,然后不要从其他方法访问它。最后一点应该很容易......因为你正在编写课程。


1 - 我想你可以一起破解一些涉及预处理代码的东西,但这会使其他各种事情变得不愉快。我的建议是不要去那里:这不值得痛苦。

【讨论】:

    【解决方案2】:

    与其试图真正保护变量,使代码更加晦涩和复杂,不如考虑通过注释和放置进行逻辑保护。我在类的开头声明了普通字段,但一个字段只能从该方法之前的一个方法访问。包含一条注释,说明它只能用于一种方法:

    // i should be used only in f
    private int i;
    /**
    * Documentation for f().
    */
    public void f(){
        System.out.println(i++);
    }
    

    【讨论】:

      【解决方案3】:

      您想要的是在相关方法本身内约束中间计算结果的能力。为此,您可以参考以下代码示例。假设您想在多次调用m() 时维护一个静态 变量i。您可以将变量i 封装到仅对m() 可见的类A 的字段中,创建一个方法f(),然后移动所有代码,而不是拥有这样一个对Java 不可行的静态变量将m() 转换为f()。您可以复制、编译和运行以下代码,看看它是如何工作的。

      public class S {
        public void m() {
          class A {
            int i;
      
            void f() {
              System.out.println(i++);
            }
          }
          A a = new A();
          a.f();
          a.f();
          a.f();
        }
        public static void main(String[] args) {
          S s = new S();
          s.m();
        }
      }
      

      【讨论】:

      • 很有趣...不会再次调用m() 导致i 被重置,因为您创建了new A()?编辑:我想我明白你的意思,但不是 100% 相信...
      • 可以,但您不必再多次致电m()。所有工作已移至f(),您可以多次调用f() 做任何您需要做的事情。
      • 因此,如果您在调用 f() 之间有任何工作要做,那么您必须将该工作放入 m() 以确保 i 不会被重置?
      • 是的,这是真的。但是如果没有其他方法接触到m() 私有的数据(并由f() 操作),你为什么要在f() 之间调用它?我想更重要的是考虑用例,这在 OP 中并不清楚。
      • 这根本不能真正保护i。尝试将a.i = 42; 放在对a.f() 的任意两次调用之间。
      【解决方案4】:

      理论上是的,但不是以传统方式。

      我会做些什么来创建这个:

      1. 在完全不同的类中创建该对象,在 private 修饰符下,不能直接访问。

      2. 使用调试工具(例如 JDI)在另一个类中查找该变量,获取它的 ObjectReference 并直接操作或创建一个引用该对象的新变量,并使用该变量对象,在你的方法中。

      这相当复杂,因为使用 JDI 很困难,而且您需要在 2 个进程上运行您的程序。 如果您想这样做,我建议您研究 JDI,但我诚实的回答是寻找其他解决方案。

      【讨论】:

        猜你喜欢
        • 2018-04-18
        • 1970-01-01
        • 2015-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多