从 java 中的 class 移除命名空间

Remove namespace from class in java

我在 IDEA 中创建了一个 Processing sketch,并且正在使用多个文件。但是,在第二个文件中,定义了 none 的 Processing 方法,所以我发现了一个技巧:

...
public static PApplet processing
public void setup () {
    processing = this;
    ...
}
...

并且我可以通过调用 Main.processing.* 访问另一个 class 中的方法(主 class 被称为 'Main')并且我可以很好地使用这些方法.

我想知道如何在每次调用函数时不必输入 Main.processing....他们像往常一样? point(...) 而不是 Main.processing.point(...)?

您可以将它们放在一个函数中:

public void point(...) {
    Main.processing.point(...);
}

虽然我不确定这是否是好的做法...

如果 Main.processing 是一个对象,您还可以将其保存在一个变量中(使用短名称)。

为了能够理解并以正确的方式做出应该做的事情,我认为你应该首先理解Java开发中的封装: public、private、protected、package(none) 和所有其他字段描述符。 我认为一个好的开始将在这里: https://www.tutorialspoint.com/java/java_encapsulation.htm 要么 https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

EDIT 1: 一个简单的例子,当然教程和文档中的案例更多,对方法也有效:

    public class A{ //"your.package.A.java"

        private int a; // Only accesible from class A, but is an instance field  :  a = 0; Only from class A
        private static int aS; // Only accesible from class A, but is a static field, one value shared to all objects of type A : aS = 0; only from class A;
        protected int aP; //  Accesible from class A or any subclasses that A can have : aP = 0; OR super.aP = 0;   
        public int aPublic; // Accessible from any class that has imported package: "your.package" : A instance = new A(); instance.aPublic = 0;
        public static int aSPublic; // // Accessible from any class that has imported package: "your.package" via class name, one value shared per all accessors : A.aSPublic = 0;
        int aPackage; // Accessible from any class that is in the same package with A and not fdrom other packages, EX: clas B, but only via instance: A instance = new A(); instance.aPackage = 0;
        int static aSPackage; // Accessible from any class that is in the same package with A by class name: A.aSPackage = 0;
    }

    public class B{ //"your.package.B.java"

    }

您可以使用 Java 反射 为要调用的方法获取 Method 个对象。 实例化此(/这些)Method 个对象并在此 class.

中使用它(/它们)

参考:http://tutorials.jenkov.com/java-reflection/methods.html

如果要访问实例方法,请将封闭对象保存在变量中。

如果要访问 class 方法,请使用 静态导入:

A single-static-import declaration imports all accessible static members with a given simple name from a type. This makes these static members available under their simple name in the class and interface declarations of the compilation unit in which the single-static-import declaration appears.

(Chapter 7.5.3. Single-Static-Import Declarations).

我认为其他问题缺少您正在使用 Processing 的上下文,它有自己的怪癖。

但通常,您要做的是将草图实例传递到任何非 PApplet class。这是一个例子:

public class MySketch extends PApplet{

  MyOtherClass myOtherClass;

  void setup(){
    myOtherClass = new MyOtherClass(this);
  }

  void draw(){
    myOtherClass.drawCircle();
  }
}

public class MyOtherClass{
  PApplet sketch;

  public MyOtherClass(PApplet sketch){
    this.sketch = sketch;
  }

  void drawCircle(){
    sketch.ellipse(100, 100, 100, 100);
  }
}

此 class 使用 this 关键字将对顶级 PApplet class 的引用传递到 MyOtherClass 构造函数中。构造函数将引用存储在一个变量中,它现在可以使用它来访问 Processing 的函数。

没有一种干净的方法来为函数设置别名,因此您可以直接调用它们,恕我直言,其他大多数答案都有些老套。你绝对应该为此使用static关键字,因为这滥用了static的目的。

我会坚持使用草图参考的直接方法。如果它真的困扰你,也许将它命名为 s 这样每个函数调用只有两个额外的字符 s.

无耻的自我推销:here 是将 Processing 用作 Java 库的指南,包括上述方法。