使用带有嵌套静态 classes 的 class 的良好做法,然后使用更多静态方法扩展包私有抽象 classes 以保持组织性?
Good practice to use a class w/ nested static classes, that then, extend package-private abstract classes with more static methods to stay organized?
也许我没有看到它,但我想不出这会导致什么问题,因为扩展抽象 class 的静态 class 无法实例化,但也许存在是我应该改用的设计模式。
这是我所说的一个例子:
public class PetTrainer
{
public PetTrainer(...)
{...}
public static class LeashInstruction extends LeashInstructionAbstract
{
//No Code
}
}
在同一个包内:
abstract class LeashInstructionAbstract
{
public static void giveTreat(...)
{...}
public static...
//imagine more
}
只是为了澄清静态方法是在 subclass 中继承的,但它不是多态的,因为你不能覆盖它们,尽管当你在 sub 中有一个具有相同签名的方法时你可以隐藏它class。如果你想让事情变得更干净,你不需要创建一个空的静态 class。
这是我根据您想要实现的目标提出的两个建议。
1. 如果所有宠物训练器的 LeashInstruction 都相同,那么您可以执行以下操作:
public class PetTrainer
{
public PetTrainer(...)
{...}
}
和:
abstract class LeashInstructionAbstract {
public static void giveTreat() {}
}
如果 PetTrainer 中的行为会发生变化 class 那么我建议执行以下操作(使用抽象方法的接口):
public class宠物训练师{
LeashInstructionImpl leashInstruction = new LeashInstructionImpl();
public宠物训练师(){
}
public static class LeashInstructionImpl implements LeashInstruction {
@Override
public void giveTreat() {
//somthing
}
}
// Just for testing
public static void main(String[] args) {
PetTrainer petTrainer = new PetTrainer();
petTrainer.leashInstruction.giveTreat();
}
}
LeashInstruction 将是:
接口 LeashInstruction {
void giveTreat();
//想象更多
}
希望这会有所帮助。
这个策略有很多问题,当我回顾这个问题从我年轻的时候开始,并试图回答它。第一个也是最大的问题是它给我的 ide、copy/pasting 所有那些 类 带来的负担,如果我不得不这样做的话。正如@GhostCat 正确指出的那样,此策略的第二个问题是设计中有些可疑的东西,它不是 OOP。如果你在 Java 中这样做,那么你不妨切换到函数式语言,因为它会更有效率。这种策略是 OOP 的变体,变得难以管理。
也许我没有看到它,但我想不出这会导致什么问题,因为扩展抽象 class 的静态 class 无法实例化,但也许存在是我应该改用的设计模式。
这是我所说的一个例子:
public class PetTrainer
{
public PetTrainer(...)
{...}
public static class LeashInstruction extends LeashInstructionAbstract
{
//No Code
}
}
在同一个包内:
abstract class LeashInstructionAbstract
{
public static void giveTreat(...)
{...}
public static...
//imagine more
}
只是为了澄清静态方法是在 subclass 中继承的,但它不是多态的,因为你不能覆盖它们,尽管当你在 sub 中有一个具有相同签名的方法时你可以隐藏它class。如果你想让事情变得更干净,你不需要创建一个空的静态 class。 这是我根据您想要实现的目标提出的两个建议。 1. 如果所有宠物训练器的 LeashInstruction 都相同,那么您可以执行以下操作:
public class PetTrainer
{
public PetTrainer(...)
{...}
}
和:
abstract class LeashInstructionAbstract {
public static void giveTreat() {}
}
如果 PetTrainer 中的行为会发生变化 class 那么我建议执行以下操作(使用抽象方法的接口):
public class宠物训练师{ LeashInstructionImpl leashInstruction = new LeashInstructionImpl(); public宠物训练师(){ }
public static class LeashInstructionImpl implements LeashInstruction { @Override public void giveTreat() { //somthing } } // Just for testing public static void main(String[] args) { PetTrainer petTrainer = new PetTrainer(); petTrainer.leashInstruction.giveTreat(); }
}
LeashInstruction 将是:接口 LeashInstruction { void giveTreat(); //想象更多
}
希望这会有所帮助。
这个策略有很多问题,当我回顾这个问题从我年轻的时候开始,并试图回答它。第一个也是最大的问题是它给我的 ide、copy/pasting 所有那些 类 带来的负担,如果我不得不这样做的话。正如@GhostCat 正确指出的那样,此策略的第二个问题是设计中有些可疑的东西,它不是 OOP。如果你在 Java 中这样做,那么你不妨切换到函数式语言,因为它会更有效率。这种策略是 OOP 的变体,变得难以管理。