java编程“静态”的另一种方式:代码可以吗?
我需要一些关于如何构建java应用程序结构的建议。就个人而言,我喜欢决定——例如在Python或C++中,如果我编程OO或不。对我来说,在Java中,静态也是一种同样的方法
我读到,大多数人说静电是“邪恶的”。所以我想到了另一个选择,也可以像对待静电一样
创建一个名为“StaticClasses”的类,其中包含每个类的一个实例,这些类的方法/属性通常是静态的
我可以创建StaticClasses
的一个实例,并在我创建的每个对象中设置对此实例的引用
我甚至可以创建一个新的对象类mObject
,它是所有事物的新父类——直接在对象之后设置这些引用
而且:我可以让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();
}
}
# 1 楼答案
这是一个非常复杂的零效益。您可以创建一个单例实例并对其抛出一些继承,但最终您无法掩盖仍然在调用静态方法的事实
Java允许使用静态方法来编写非100%面向对象的代码。例如,
Math.sin(0.5)
非常好;你不想写new Double(0.5).sin()
之类的东西。避免静态方法的建议不是你需要遵循的教条——这是一个普遍的警告,你可能需要考虑一种更面向对象的方法。你的方案根本无助于让事情变得更加面向对象,所以这是一种误导# 2 楼答案
很难用一个学术例子来回答静态是邪恶的是一条一般规则,与任何一般规则一样,它可能有例外。一种是单例模式,其中单例对象是通过静态方法访问的类中的静态变量。以Spring Framework这样的大型知名项目为例,您将看到它们确实使用静态
静态被认为是邪恶的,因为它经常在另一个对象或类更合适时使用。一个常见的例子是大学里的学生。大学名称对所有学生来说都很常见,第一个想法是让它在学生课堂上保持静态,就像大学的其他参数一样。现在,由于这个项目是友好的,你想把它扩展到另一所大学。。。所有的崩溃都是因为大学在学生课堂上是静态的:你应该在学生课堂上有一个大学课堂和该课堂的一个对象(不是静态的)
另一个例子是一个类中对象的数量。通常情况下,工厂对象比静态字段更好:如果以后要分别计算两种对象,该怎么办
对于你当前的问题,最好的答案是蜘蛛鲍里斯的评论:你正在通过创建一些真正可怕的东西来避免一个Java“法令”(静态是邪恶的)。