另一种编程方式 "static": 代码可以吗?
Another way to program "static": Is Code ok?
我需要一些关于如何构建我的 java 应用程序的建议。就我个人而言,我喜欢决定——比如在 python 或 C++ 中——我是否对 OO 进行编程。对我来说,静态是在 Java.
中做同样事情的一种方式
我看了一下,大多数人说静态是"evil"。所以我想到了另一种选择,即使用 static 做同样的事情。
如何创建一个名为 "StaticClasses" 的 class,其中包含每个 class 的实例,methods/attributes 通常是静态的。
我可以创建一个 StaticClasses
的实例,并在我创建的每个对象中设置对此实例的引用。
我什至可以创建一个新对象-class mObject
,它是所有对象的新父对象-class - 直接在对象之后设置这些引用。
并且:我可以让 StaticClasses
class 成为单例。
只是一些小的代码示例,所以你明白我的意思:
// 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();
}
}
为了零收益,复杂化了很多。您可以创建一个单例实例并对其进行继承,但最终您无法掩盖您仍在调用静态方法的事实。
Java 允许静态方法作为一种让您编写不是 100% 面向对象的代码的方法。例如,Math.sin(0.5)
完全没问题;你不想写像 new Double(0.5).sin()
这样的东西。避免使用静态方法的建议并不是您需要遵循的教条 — 它是一个一般性警告,提示您可能需要考虑更面向对象的方法。您的方案根本无助于使事情更加面向对象,因此这是一种误入歧途的努力。
学术上的例子很难回答。 静态是邪恶的 是一般规则,作为任何一般规则,它可能有例外。一种是单例模式,其中单例对象是其 class 中的静态变量,可通过静态方法访问。以 Spring Framework 等大型知名项目为例,您会发现它们确实使用了静态。
静态被认为是邪恶的,因为它经常在另一个对象或 class 更合适时使用。一个常见的例子是大学里的学生。大学名称对所有学生都是通用的,第一个想法是在学生 class 中将其设为静态,至于大学的其他参数。现在,由于该程序很友好,您想将其扩展到另一所大学……并且所有崩溃都是因为大学在学生 class 中是静态的:您应该有一所大学 class 和该大学的一个对象 [=学生 class
中的 24=](不是静态的)
另一个例子是一个对象的数量class。通常有一个工厂对象来计算它们比静态字段更好:如果您稍后想分别计算两种对象怎么办?
对于您当前的问题,最好的答案是蜘蛛鲍里斯的评论:您正在通过创造一些真正可怕的东西来避免 Java "edict"(静态是邪恶的).
我需要一些关于如何构建我的 java 应用程序的建议。就我个人而言,我喜欢决定——比如在 python 或 C++ 中——我是否对 OO 进行编程。对我来说,静态是在 Java.
中做同样事情的一种方式我看了一下,大多数人说静态是"evil"。所以我想到了另一种选择,即使用 static 做同样的事情。
如何创建一个名为 "StaticClasses" 的 class,其中包含每个 class 的实例,methods/attributes 通常是静态的。
我可以创建一个 StaticClasses
的实例,并在我创建的每个对象中设置对此实例的引用。
我什至可以创建一个新对象-class mObject
,它是所有对象的新父对象-class - 直接在对象之后设置这些引用。
并且:我可以让 StaticClasses
class 成为单例。
只是一些小的代码示例,所以你明白我的意思:
// 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();
}
}
为了零收益,复杂化了很多。您可以创建一个单例实例并对其进行继承,但最终您无法掩盖您仍在调用静态方法的事实。
Java 允许静态方法作为一种让您编写不是 100% 面向对象的代码的方法。例如,Math.sin(0.5)
完全没问题;你不想写像 new Double(0.5).sin()
这样的东西。避免使用静态方法的建议并不是您需要遵循的教条 — 它是一个一般性警告,提示您可能需要考虑更面向对象的方法。您的方案根本无助于使事情更加面向对象,因此这是一种误入歧途的努力。
学术上的例子很难回答。 静态是邪恶的 是一般规则,作为任何一般规则,它可能有例外。一种是单例模式,其中单例对象是其 class 中的静态变量,可通过静态方法访问。以 Spring Framework 等大型知名项目为例,您会发现它们确实使用了静态。
静态被认为是邪恶的,因为它经常在另一个对象或 class 更合适时使用。一个常见的例子是大学里的学生。大学名称对所有学生都是通用的,第一个想法是在学生 class 中将其设为静态,至于大学的其他参数。现在,由于该程序很友好,您想将其扩展到另一所大学……并且所有崩溃都是因为大学在学生 class 中是静态的:您应该有一所大学 class 和该大学的一个对象 [=学生 class
中的 24=](不是静态的)另一个例子是一个对象的数量class。通常有一个工厂对象来计算它们比静态字段更好:如果您稍后想分别计算两种对象怎么办?
对于您当前的问题,最好的答案是蜘蛛鲍里斯的评论:您正在通过创造一些真正可怕的东西来避免 Java "edict"(静态是邪恶的).