编程“静态”的另一种方法:代码是否正常?

时间:2015-06-10 07:29:34

标签: java static

我需要一些关于如何构建我的java应用程序的建议。我个人喜欢决定 - 例如在python或C ++中 - 如果我编写OO或不编程OO。对我来说,静态是一种在Java中做同样事情的方法。

我读过,大多数人都说静电是“邪恶的”。所以我想到了另外一个与静态相同的选择。

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

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

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

并且:我可以使StaticClasses类成为单身人士。

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

// 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();
    }
}

这是一个好主意还是一个非常糟糕的主意?你知道有什么改进吗?你知道这段代码的缺点吗?静态应该有稍微好一点的性能,但不应该有太大的区别。或者我应该在需要的地方手动设置引用 - 即使这意味着更复杂的代码。

更新:

你不喜欢单身人士。没有单例的新代码(名称不是最终的):

// 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();
    }
}

2 个答案:

答案 0 :(得分:1)

零利益的复杂化很多。你可以创建一个单例实例并在其上抛出一些继承,但最后你不能粉饰你仍在调用静态方法的事实。

Java允许使用静态方法来编写非100%面向对象的代码。例如,Math.sin(0.5)完全没问题;你不想写new Double(0.5).sin()之类的东西。避免静态方法的建议不是你需要遵循的教条 - 这是一个警告,你可能想要考虑更面向对象的方法。你的方案无助于使事物更加面向对象,所以这是一种误入歧途的努力。

答案 1 :(得分:1)

很难回答一个学术上的例子。 静态是邪恶的是一般规则,并且作为一般规则,它可能有例外。一种是单例模式,其中单例对象是通过静态方法访问的类中的静态变量。以Spring Framework等大型知名项目为例,你会发现它们确实使用了静态。

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

另一个例子是一个类中的对象数量。通常最好有一个工厂对象来计算它们而不是一个静态字段:如果你以后想要分别计算两种对象怎么办?

对于你当前的问题,最好的答案是鲍里斯蜘蛛的评论:你正在避免一个Java" edict" (静态是邪恶的)通过创造真正可怕的东西