Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “另一种编程方式”;“静态”是:代码行吗?_Java_Static - Fatal编程技术网

Java “另一种编程方式”;“静态”是:代码行吗?

Java “另一种编程方式”;“静态”是:代码行吗?,java,static,Java,Static,我需要一些关于如何构建java应用程序结构的建议。就个人而言,我喜欢决定——例如在Python或C++中,如果我编程OO或不。对我来说,在Java中,静态也是一种同样的方法 我读到,大多数人说静电是“邪恶的”。因此,我想到了另一种方法,与使用static时的方法相同 创建一个名为“StaticClasses”的类,其中包含每个类的实例,这些类的方法/属性通常是静态的 我可以创建一个StaticClasses实例,并在我创建的每个对象中设置对此实例的引用 我甚至可以创建一个新的对象类mObject

我需要一些关于如何构建java应用程序结构的建议。就个人而言,我喜欢决定——例如在Python或C++中,如果我编程OO或不。对我来说,在Java中,静态也是一种同样的方法

我读到,大多数人说静电是“邪恶的”。因此,我想到了另一种方法,与使用static时的方法相同

创建一个名为“StaticClasses”的类,其中包含每个类的实例,这些类的方法/属性通常是静态的

我可以创建一个
StaticClasses
实例,并在我创建的每个对象中设置对此实例的引用

我甚至可以创建一个新的对象类
mObject
,它是所有事物的新父类-直接在对象之后设置这些引用

而且:我可以使
静态类
类成为单例

只是一些小的代码示例,所以您知道我的意思:

// mObject.java
public class mObject{
    static StaticClasses staticCl = StaticClasses.I;
}

// StaticClasses.java
public class StaticClasses{
    public static StaticClasses I = new StaticClasses();

    // declare instance of each "static" class
    public Example0 ex0 = new Example0();       
    public Example1 ex1 = new Example1();

    private StaticClasses(){
    }
}

// Example0.java
public class Example0 extends mObject{
    public void do_something(){
        System.out.println("function call example 0");
    }
}

// Example1.java
public class Example1 extends mObject{
    public void do_something2(){
        // class "static" function
        staticCl.ex0.do_something();    
    }

    public static void main(String[] args){
        // call "static" function
        staticCl.ex1.do_something2();
    }
}
这是个好主意还是真的坏主意?你知道有什么改进吗?你知道这个代码的缺点吗?静态应该有稍微好一点的性能,但不会有太大的区别。或者我应该在需要的地方手动设置引用-即使这意味着更复杂的代码

更新:

你不喜欢单身汉。不带单例的新代码(名称不是最终名称):


这是一个非常复杂的零效益。您可以创建一个单例实例并对其抛出一些继承,但最终您无法掩盖仍然在调用静态方法的事实


Java允许使用静态方法来编写非100%面向对象的代码。例如,
Math.sin(0.5)
非常好;您不希望必须编写类似于
newdouble(0.5).sin()之类的东西。
。避免静态方法的建议不是你需要遵循的教条——这是一个普遍的警告,你可能需要考虑一种更面向对象的方法。你的方案根本无助于使事情更加面向对象,因此这是一种误导。

很难用一个学术例子来回答。静态是邪恶的是一个普遍的规则,和任何普遍的规则一样,它可能有例外。一种是单例模式,其中单例对象是通过静态方法访问的类中的静态变量。以大型知名项目(如SpringFramework)为例,您将看到它们确实使用静态

静态被认为是邪恶的,因为它经常在另一个对象或类更合适时使用。一个常见的例子是大学里的学生。大学名称对所有学生来说都是通用的,第一个想法是让它在学生课堂上保持静态,就像大学的其他参数一样。现在,由于该计划是友好的,你想把它扩展到另一所大学。。。所有崩溃都是因为大学在学生类中是静态的:你应该在学生类中有一个大学类和该类的一个对象(不是静态的)

另一个例子是一个类中对象的数量。通常,使用一个工厂对象对它们进行计数比使用静态字段要好:如果以后要分别对两种对象进行计数,该怎么办


对于您当前的问题,最好的答案是Boris the Spider的评论:您通过创建一些真正可怕的东西来避免Java“法令”(静态是邪恶的)。

如果它们不是静态的,我不会称之为
静态类。
。这是使用a来保存您的单例的扩展。您通过创建一些真正可怕的东西来避免Java“法令”(
static
是邪恶的)。我强烈建议你像避免瘟疫一样避免这种模式。如果需要单件,请使用。我还建议您阅读关于DI的内容,这是推荐的,而不是全局状态。为什么您要重新定义“StaticClasses”的实例“I”同样在mObject中,您已经可以通过StaticClass访问它了。I?如果您能解释一下您想普遍使用静态的原因,特别是这个模式,可能会对您更有好处。@shmosel-yeah;名字不太好谢谢你的回答;我更新了我的代码,所以不再有单身汉了。如果发生了意想不到的事情,我需要创建第二个实例,这可能是一个好处。不过,这可能是对继承的一个非常不恰当的使用。(我不能肯定,用你假设的名字)抱歉,但最后一个问题是:创建一个类来容纳其他对象是可以的,不是吗?也许吧。我建议不要用假设性的泛泛而谈,而是用解决实际问题的具体用例发布一个问题。然后我们可以评估你的方法是否合适。请先阅读,以确保您发布的问题类型正确。
// mObject.java
public class mObject{
    Classes cl;
    public mObject(Classes c){
        cl=c;
    }
}

// Classes.java
public class Classes{
    // declare instance of each "static" class
    public Example0 ex0 = new Example0(this);       
    public Example1 ex1 = new Example1(this);
}

// Example0.java
public class Example0 extends mObject{
    public void do_something(){
        System.out.println("function call example 0");
    }
}

// Example1.java
public class Example1 extends mObject{
    public void do_something2(){
        // class "static" function
        cl.ex0.do_something();    
    }

    public static void main(String[] args){
        // call "static" function
        cl.ex1.do_something2();
    }
}