首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我有一个包含14个静态方法和4个静态属性的类 - 那很糟糕吗?

这个问题涉及到面向对象编程中的类设计和代码质量的问题。一个包含14个静态方法和4个静态属性的类并不一定是糟糕的,但也可能存在一些问题。下面是我对这个问题的完善和全面的回答:

一个包含14个静态方法和4个静态属性的类可能存在以下问题:

  1. 单一职责原则(Single Responsibility Principle):一个类应该只有一个引起它变化的原因。如果一个类包含过多的方法和属性,可能意味着它承担了过多的责任,违反了单一职责原则。这样的类可能难以理解、维护和扩展。
  2. 代码复用性和可维护性:过多的静态方法和属性可能导致代码的复用性和可维护性降低。如果这些方法和属性之间没有明确的关联,可能会导致代码的冗余和重复。
  3. 类的设计和结构:一个类应该具有清晰的设计和良好的结构。过多的静态方法和属性可能使类的设计变得混乱和不清晰,难以理解和维护。

针对这个问题,可以考虑以下改进措施:

  1. 分解类:根据单一职责原则,将这个类分解成多个小的、具有清晰职责的类。每个类只负责一个特定的功能或任务,提高代码的可读性、可维护性和可扩展性。
  2. 提取公共方法和属性:如果这些静态方法和属性之间存在一定的关联,可以考虑将它们提取成公共的方法和属性,以提高代码的复用性和可维护性。
  3. 使用设计模式:根据实际需求,可以考虑使用适当的设计模式来改善类的设计和结构,例如工厂模式、策略模式、观察者模式等。
  4. 代码重构和优化:对于已有的代码,可以进行代码重构和优化,消除冗余和重复的部分,提高代码的可读性和性能。

总结起来,一个包含14个静态方法和4个静态属性的类并不一定是糟糕的,但需要注意类的设计原则和代码质量。通过合理的类设计、代码重构和优化,可以提高代码的可读性、可维护性和可扩展性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

你知道Java中finalstatic修饰变量是在什么时候赋值

翻阅了《深入理解Java虚拟机》第二版,在第191页,确实有前面那句话 书中说清楚,ConstantValue属性作用是通知虚拟机自动为静态变量赋值。...于是翻阅了官网JVM规范,在4.7.2部分找到了这样一句话: 书中说清楚: 如果field_info(字段表)表示静态字段包含了ConstantValue属性,那么这个ConstantValue...static修饰变量 ---- 上面讲到ConstantValue属性作用是通知虚拟机为静态变量赋值。 什么是静态变量?static修饰变量! static修饰变量是什么时候加载呢?...JVM 规范这样写道: 说白了,编译器会收集所有静态变量赋值动作、所有静态代码块,合并产生一个方法,即方法方法在上面那张加载图中初始化阶段执行。...现在你应该对加载过程一个大致了解了。 回到static修饰变量(变量),变量两种赋值方式可以选择: 使用ConstantValue属性赋值。

1.8K20

Java 中三大特性(超详细篇)

)去做 抽象一个很重要特点:抽象可以没有抽象方法,但是如果一个抽象方法,那么这个肯定是抽象 为什么会有抽象 解耦,使代码结构更加清晰 因为抽象不能被直接创建为对象,它只是作为一个通用接口来供别人实现调用...重载(overloading)覆写(overwriting) 重载覆写是两个容易混淆概念 重载:同一个中,一个方法多种表现形式(参数类型不同,参数个数不同) 覆写:继承设计中,子类覆盖父方法...因为多继承会导致”致命方块”问题(因为像扑克牌方块符号) 比如A同时继承BC,然后BC各自继承D BC各自覆写了Dfun方法 这时A该调用哪个fun方法呢 下面用图来说话 为什么叫致命方块...(男人是人,is-a关系) 如果子类只是包含或者引用关系,那么这个继承关系就很糟糕(猫是猫笼,包含关系) 有没有什么办法可以阻止继承?...(default修饰符)和静态方法(static修饰符),会包含方法内容,这样别人可以直接调用接口方法(后面章节再细讲) 这样你会发现接口变得很像抽象了,不过接口支持多实现(即一个可以同时实现多个

96710
  • Java中三大特性 - 超详细篇

    )去做 抽象一个很重要特点:抽象可以没有抽象方法,但是如果一个抽象方法,那么这个肯定是抽象 为什么会有抽象 解耦,使代码结构更加清晰 因为抽象不能被直接创建为对象,它只是作为一个通用接口来供别人实现调用...重载(overloading)覆写(overwriting) 重载覆写是两个容易混淆概念 重载:同一个中,一个方法多种表现形式(参数类型不同,参数个数不同) 覆写:继承设计中,子类覆盖父方法...因为多继承会导致"致命方块"问题(因为像扑克牌方块符号) 比如A同时继承BC,然后BC各自继承D BC各自覆写了Dfun方法 这时A该调用哪个fun方法呢 下面用图来说话 为什么叫致命方块...(男人是人,is-a关系) 如果子类只是包含或者引用关系,那么这个继承关系就很糟糕(猫是猫笼,包含关系) 有没有什么办法可以阻止继承?...修饰符)和静态方法(static修饰符),会包含方法内容,这样别人可以直接调用接口方法(后面章节再细讲) 这样你会发现接口变得很像抽象了,不过接口支持多实现(即一个可以同时实现多个,但是一个类同时只能继承一个

    52410

    静态工厂方法

    这或许已经是我们习以为常并脱口而出,正如下所示: Animal animal = new Animal(); 直接new对象会调用当前构造方法参或者无参),这看起来很正常,但有些时候或许这样做会为以后扩展不是友好...那我们如果直接添加4构造函数就会出现编译异常,那我们也许会想到这不是默认无参构造器?直接按照下面这样写不就得了?...但如果业务代码想要创建一个包含weight属性Animal对象的话就得重复上述代码,那有没有更好一种写法来避免这种问题呢?...Animal,那我小伙伴想要利用Animal生成一个Dog对象,只需要调用Animal.createDog(),不用关心具体参数值啥。...附录:针对java中有关静态工厂方法一些通俗约定 1、from一一型转换方法,它只有单个参数,返回该类型一个相对应实例, 2、of 聚合方法,带有多个参数,返回该类型一个实例,把它们合并起来,

    52420

    关于继承,私有化及final关键字等一些理解

    所以这里方法就很重要:get_called_class(),可以获取真实调用子类名 当方法属性都写好后,我怕AppModel子类由于某种原因不小心把属性覆盖了怎么办,这样可能会导致方法数据计算错误...如果子类想访问获取设置父AppModel私有属性怎么办?...这个时候getset方法作用就体现出来了,可以写两个方法一个获取这个私有属性一个用于修改这个私有属性 我怕别人不小心在子类中将我父方法重写,而出现一些不可控错误,但是又希望保持继承关系...觉得一直用一个变量去调用一个方法这样繁琐,想实现链式调用用来方便操作 可以使用返回this,在方法结束后返回this,这样实际在调用时候并不需要用变量来保留,可以直接继续调用下一个方法。...想定义一个永远不会被改变变量 可以用const 关键字定义一个属性,一旦被const定义后在程序中就不能更改。访问也必须用静态调用。 对象可以直接调用静态方法

    40810

    Python - 面向对象编程 - 实例方法静态方法方法

    : 小菠萝 and my age is : 24 假设不传实例对象,pycharm 会有warning 方法 方法实例方法相似,又很不相似 相似点 也至少要包含一个参数,不过通常命名为 cls...: ,通过 cls 调用,且还要传递 cls 为参数 cls.实例方法(cls) 从 id 相同即可看出,实例方法接收仍然是一个对象 实例对象可以调用方法?...且 cls、self 参数 id 上面的栗子完全一样,表明即使通过实例对象调用方法,传递仍然是对象引用,所有方法都被同一个对象调用,一个只有一个对象 实例方法可以调用类属性?...静态方法 之前学过函数一毛一样,唯一区别是:静态方法需要定义在体中,且需要添加 装饰器 @staticmethod 静态方法没有 self、cls 参数,也不需要至少传一个参数,普通函数一样...Python 解释器不会对它包含参数做任何或对象绑定,所以静态方法无法调用任何类属性方法、实例属性、实例方法,除非通过实例对象 什么时候会用静态方法 里面封装方法 既不需要访问实例属性

    61540

    JVM 《八 JVM JDK代理&CGLib 代理解析》

    前言&背景 现在Spring 什么好火。 Spring 经典一个特性是AOP AOP 基础是代理。 代理分为静态代理、动态代理。...然后单独使用时候写法儿上不同。 在JVM层面去看待这个问题是怎样呢? 其实本质要讨论就是Java 反射、字节码操作具体是怎么样什么区别。...下面是百度解释,感觉挺糟糕 也就是在运行状态中,对于任意一个,都能够知道这个所有属性方法;对于任意一个对象,都能够调用它任意方法属性;这种动态获取信息以及动态调用对象方法功能称为java...(静态加载、根据已知信息直接使用) 为什么是反着呢,因为我们常规写程序都是既定使用&方法然后import、然后加载产生Class对象&使用具体信息 驱动执行。...其中ASM核心 ClassLoader(解析Class 文件用)、ClassWriter(重新构建编译)、ClassAdapter(委托方法调用给同样实现ClassVister接口对象) 兴趣可以去看看

    40110

    会写「18.dp」只是个入门——Kotlin 扩展函数属性(Extension FunctionsProperties)

    视频先行 开始 Kotlin 个特别好用功能叫扩展,你可以给已有的去额外添加函数属性,而且既不需要改源码也不需要写子类。这就是今天这个视频主题。...这个 pow(a, n) 方法是 Math 一个静态方法,这类方法我们用得比较多是 max() min() Math.max(1, 2); // 2 Math.min(1, 2); //...1 比较两个数大小,用静态方法符合直觉;但是幂运算的话,静态方法就不如成员方法来得更直观了: 2.pow(10); // 要是 Java 里能这样写就好了 但我们只能选择静态方法。...这……成员函数什么区别?这种奇怪又绕脑子知识什么用?听我继续讲。...但同时,又有一个问题不知道你们发现没有:既然 Receiver 函数可以以无 Receiver 方式来调用,……它可以赋值给无 Receiver 函数类型变量

    95110

    《编写高质量代码》学习笔记(1)

    静态导入后,代码中就不用再写名了,但是我们知道是“一事物描述”,缺少了修饰,静态属性静态方法表象意义可以被无限放大,这会让阅读者很难弄清楚其属性方法代表何意,甚至是哪一个属性方法...所以,对于静态导入,一定要遵循两个规则: 不使用*(星号)通配符,除非是导入静态常量(只包含常量或接口)。 方法名是具有明确、清晰表象意义工具。 何为具有明确、清晰表象意义工具?...构造代码块:在中没有任何前缀后缀,并使用"{}"括起来代码片段; 么知道一个中至少有一个构造函数(如果没有,编译器会无私为其创建一个无参构造函数),构造函数是在对象生成时调用现在为你来了...静态内部类普通内部类什么区别呢?...普通内部类不能声明static方法变量:普通内部类不能声明static方法变量,注意这里说是变量,常量(也就是final static 修饰属性)还是可以,而静态内部类形似外部类,没有任何限制

    1.4K40

    使用C# (.NET Core) 实现单体设计模式 (Singleton Pattern)

    这是个鸡问题: 可以使用MyClass里面的构造函数, 但是无法实例化这个对象, 因为其他无法使用 "new MyClass()"....B: MyClass一个静态方法, 我们可以这样调用静态方法: MyClass.getInstance(); A: 为什么使用MyClass, 而不是某个对象名?...B: 因为getInstance()是静态方法; 也就是说, 它是一个方法, 你需要使用名来调用方法. A: 非常有趣, 那么把实例化代码放里面呢? B: 确实可以有这种操作......A: 那么, 现在你认为第二种方法来实例化对象? B: MyClass.getInstance(); A: 那么你现在能写出只允许创造一个MyClass实例代码了吗? B: 应该行....所以如果性能是问题, 就可以使用这个方法. 其他问题 Q: 如果创建一个, 里面都是静态方法静态变量, 那么它效果单体模式不是一样?

    97940

    Java IAQ:很少被回答问题

    Q:什么是很少被回答问题? 一个问题如果被回答地很少,可能是因为知道答案的人很少,亦或是因为问题本身模糊不清、微不足道(但对你来讲可能关键)。...所以,当你调用table.get(new C(…))时,this会在C中寻找参数为Objectequals方法。如果恰巧你一个参数定义为为Cequals方法并没有任何关系。...然而,如果你可以保证每个线程中只有一个Browser对象(尽管每个Browser对象可能会有多个线程),那么一种比较好解决方法:在Browser中存储一个静态表,保存线程与Browser对象之间映射关系...Q:哪些其它操作出奇慢? 该从何说起?下面是一些最该知道东西。一个循环里写了一个计时功能,用来报告每秒钟千次迭代速度(K/sec)每次迭代所需微秒数(uSecs)。...Q:能从书本中获得一些关于Java好建议么? Java相关书籍很多,大概可以分为三个等级: 糟糕

    61920

    Java动态绑定与静态绑定之胡思乱想

    参考链接: Java 静态绑定动态绑定 Java动态绑定与静态绑定之胡思乱想   之所以写这篇博客,是因为写代码过程中遇到了奇怪现象,觉得只能通过动态绑定与静态绑定来解释,于是,就学习了一下动态绑定与静态绑定实现原理...静态绑定实现原理:当初次调用一个使用静态绑定方法时,java字节码层面是去调用常量池中一个常量表,这个常量表描述了这个方法具体信息(包括详细名,函数名称,返回值,存在CONSTANT_Methodref_info...5.你前面都在说方法,那你知道变量是静态连接还是动态连接?  答:先说答案,变量采用静态连接。这正是开篇讲写程序时遇到困扰问题,也正是由于此,才想到了要学习静态绑定与动态绑定。...先看一个奇妙现象:        以上代码输出如下:    我们发现,直接访问属性value,访问到是父;而访问方法,又访问到是子类。...基于属性静态绑定这个事实,也就可以容易解释:在继承中,属性只能被隐藏,而方法可以被覆盖或隐藏(静态方法是隐藏)。

    1K40

    使用 C#.NET Core 实现单体设计模式

    这是个鸡问题: 可以使用MyClass里面的构造函数, 但是无法实例化这个对象, 因为其他无法使用 "new MyClass()"....B: MyClass一个静态方法, 我们可以这样调用静态方法: MyClass.getInstance(); A: 为什么使用MyClass, 而不是某个对象名?...B: 因为getInstance()是静态方法; 也就是说, 它是一个方法, 你需要使用名来调用方法. A: 非常有趣, 那么把实例化代码放里面呢? ? B: 确实可以有这种操作......A: 那么, 现在你认为第二种方法来实例化对象? B: MyClass.getInstance(); A: 那么你现在能写出只允许创造一个MyClass实例代码了吗? B: 应该行....所以如果性能是问题, 就可以使用这个方法. 其他问题 Q: 如果创建一个, 里面都是静态方法静态变量, 那么它效果单体模式不是一样?

    66760

    从 static 关键字深入理解 java对象初始化顺序

    这段代码总共四行,除了第一行都是用 static 关键字修饰,这里我们设想一个问题,当初始化时候,这四行代码是从上往下执行? 答案是:”否“。...静态静态块主要用于初始化,不是指对象实例化。它只会执行一次,静态块只能访问静态成员属性方法,不能在静态块使用 this。...发现不管是静态块还是静态变量,它们之间都是按顺序执行为什么是静态块、静态变量初始化是顺序呢?...这就解释了为什么在对象未实例化前,可以通过 “名.静态属性变量、名.静态方法方式访问静态变量和静态方法了。...(而一个接口在初始化时,并不要求其父接口全部都完成了初始化) 虚拟机启动时,用户需要指定一个要执行包含 main() 方法那个),虚拟机会先初始化这个主

    42010

    灵魂拷问:Java内部类是如何访问外部类私有对象

    可以看到,外部类OutClass除了默认构造器私有的属性:name,id,address还多了三个静态方法,这三个方法不是我们手写。是编译器自动生成,什么作用呢。...但是仅仅拿到引用个毛线用,通过反编译可以看到,生成是两个字节码文件,在虚拟机看来,这就是两个不相关,你能在一个中调用另外一个私有属性??? 很明显不能。...将指向外部类引用作为参数给三个外部类中静态方法 然后我们去反编译看看三个静态方法怎么实现 又是祭出伟大反编译工具 ? 看得出,这三个方法都是返回外部类对应私有属性!...不过对于这点我还有点要说明,编译器智能,它会扫描内部类,查看是否调用外部类私有属性,只有调用了才会生成对应acess$xxx方法!...这个方法是返回对应私有属性值。所以可以在一个外部获取一个私有属性值 推荐文章 老板:kill -9原理都不知道就敢到线上执行,明天不用来了 2020年国内互联网公司薪酬排名!

    2.6K10

    哪些代码设计看似是面向对象,实际是面向过程

    滥用 getter、setter 方法 在之前参与项目开发中,经常看到,同事定义完属性之后,就顺手把这些属性getter、setter 方法都定义上。...但如果你是用类似 Java 这样面向对象编程语言来做开发,全局变量全局方法就不是很多见了。 在面向对象编程中,常见全局变量单例对象、静态成员变量、常量等,常见全局方法静态方法。...而拼接分割两个方法,不需要共享任何数据,所以新不需要定义任何属性,这个时候,我们就可以把它定义为只包含静态方法 Utils 了。...实际上,只包含静态方法包含任何属性 Utils ,是彻彻底底面向过程编程风格。但这并不是说,我们就要杜绝使用 Utils 了。...在定义 Utils 之前,你要问一下自己,你真的需要单独定义这样一个 Utils ?是否可以把 Utils 某些方法定义到其他中呢?

    80661

    进程,线程,协程 - 你了解多少?

    蛋先生:正是如此,程序是静态,而进程则是动态 丹尼尔:说得更糊涂了 蛋先生:好吧,以你电脑上视频播放器(就是一个程序)为例。...进程就是程序实例(就像面向对象编程中静态,只有实例化后才运行,且同一个可以多个实例) 为什么需要进程?...为了实现这个目的,一个进程就需要进化成多个线程来同时执行多个任务 丹尼尔:如果一个进程只能做一件事,用两个进程不也可以同时做两件事? 蛋先生:你说得对,但进程间是完全独立,互不干扰。...因为 add 方法执行了两次,正确结果 a 值应该是 +2。但遗憾,结果是 +1。这样结果有时候会让你摸不着头脑,而不稳定结果也将会导致应用不稳定 丹尼尔:啊,是这样啊。该怎么办?...线程已经相当不错了,协程又是怎么回事呢? 蛋先生:回想一下,我们之前一个线程负责运行加载和解码逻辑,另一个线程负责播放逻辑,对吧? 丹尼尔:没错,什么问题? 蛋先生:其实还有优化空间。

    44542

    net5依赖注入 原

    以前写代码用到 .net框架以及第三方库,都是提供好一个,然后我们就是实例化这个,调用它各个方法来写程序。这样问题?没问题,喜欢。 但有人却不喜欢,非要“注入”一下。...应该是待注册一个描述信息。 ServiceDescriptor主要是5个属性,以及大量静态方法,这些方法也只是为了构造一个对象。   ...这4个属性未必要构造时给值,就是说可以为空,只要能判断出来2个类型即可。并且这两个类型可以相同。...这个3个构造函数,以及Instance,Describe,Transient,Scoped,Singleton这5个静态函数扩展,使用大量重载。...这5个静态函数最终都是调用构造函数,并返回ServiceDescriptor一个对象。 第5:   感觉应该先讲第5,后讲第4.

    1.6K10

    【C++】继承

    大家想,要定义学生,学生是人吗? 当然是人,这是毫无疑问。 那它具备人属性?当然具备。人有名字、年龄这些属性学生也是一个人,他当然也具备这些属性当具备人方法?当然也具备。...那我们定义一个学生时候再去给它定义名字年龄这些属性以及吃饭喝水这些方法,就显得有点麻烦了。如果后续再定义一个老师呢?再定义一个辅导员呢?...我们上面说了,继承可以保持原有特性(即新继承了原有,就直接拥有了原有各种属性方法),我们可以在他基础上增添新属性方法(比如学生还有学号属性考试方法),然后产生一个新符合需求...之前我们说过,在一个工程里面可以同名变量或函数等,只要它们不在同一个域就可以,因为在同一个域的话就会出现命名冲突问题。 在子类中可以?...继承了你,也有独属于自己_name属性。 我们看到它们地址也是不一样对于静态成员来说呢?

    13610

    设计模式系列 - 单例模式

    提供一个公开get方法获取唯一这个实例 单例模式什么好处呢?...最后这种也是最青睐一种(代码少)。 总结 最后大家应该都知道单例模式写法了,也知道优劣势使用场景了,开头那个问题大家心里答案了么? 什么?连问题都忘了?...如果一个方法和他所在实例对象无关,那么它就应该是静态,反之他就应该是非静态。如果我们确实应该使用非静态方法,但是在创建时又确实只需要维护一份实例时,就需要用单例模式了。...我们电商系统中就有很多很多配置属性,这些配置属性是一定存在了,又是公共,同时需要在整个生命周期中都存在,所以只需要一份就行,这个时候如果需要再需要时候new一个,再给他分配值,显然是浪费内存并且再赋值没什么意义...所以我们用单例模式或静态方法去维持一份这些值且只有这一份值,但此时这些配置属性又是通过面向对象编码方式得到,我们就应该使用单例模式,或者不是面向对象,但他本身属性应该是面对对象,我们使用静态方法虽然能同样解决问题

    48820
    领券