加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java OO Design帮助 – 如何抽象出一个save方法?

发布时间:2020-12-15 05:06:39 所属栏目:Java 来源:网络整理
导读:我有一个Preference类(模块),用于几个不同的应用程序.基本上它是首选项的缓存,因此系统不必一直调用后端.它类似于缓存,但有一些额外的细节,如isPreferenceSelected,有一些辅助方法等. 问题是我想在类中包含一个savePreference,以便任何使用它的人都可以覆盖
我有一个Preference类(模块),用于几个不同的应用程序.基本上它是首选项的缓存,因此系统不必一直调用后端.它类似于缓存,但有一些额外的细节,如isPreferenceSelected,有一些辅助方法等.

问题是我想在类中包含一个savePreference,以便任何使用它的人都可以覆盖该方法,无论是数据库,还是平面文件等.关键是这个模块不想要照顾.问题是它不是一个抽象类,所以我不能override the static methods,即使它是,我也不想创建一百万个实例,因为我不想每次都加载首选项.而且我也无法创建abstract singleton.

因此我不知道该怎么做.这是我想要评论的代码片段:

// Please ignore the missing Generics,etc.
public class Preference
{
  private static HashMap preferences = new HashMap();

  public static ... 

  // Some preferences are objects,such as images,etc.
  public static setPreference(String name,Object value)
  {
    .. some helper code
    preferences.put(name,value); // ignoring issues with if it already exists ;)
    savePreference(name,value); // saves to database,flatfile,etc.
  }
}

这是不同系统利用的核心类/代码.现在我想做的是在webapp,桌面应用程序等中说,能够在我的代码中使用这个类,例如:

public someFunction(...)
{
  .. do some cool code
  Preference.savePreference("logoImage",image);
}

并且savePreference()方法不仅保存内存中的首选项,还将其保存到外部源.否则我到处都有savePreference()我必须通过db调用savePreferenceToDB(),一个FlatFile调用,例如savePreferenceToFlatFile()来跟踪它,依此类推.这非常容易出错,有人会忘记保存它.另外,使用这种类型的代码将保存洒到任何地方的永久存储代码真的没有意义,因为它应该只执行一次.还要记住,主模块不知道永久存储是数据库,xml文件,平面文件等.

提示:如果我执行了Preference.getInstance().savePreference(),因为you can’t abstract a singleton不能正常工作.而且由于it’s not possible to override a static method,我无法创建静态方法savePreference().

我能看到的唯一选择是创建某种复杂的Factory模式,但这对我来说似乎有点过分.因此,我们将非常感谢任何建议.

解决方法

这听起来像是您的依赖注入(DI)容器应该处理的东西,而不是复杂的工厂模式.

也就是说,我认为你应该抛弃静态的用法,让其他应用程序创建其他应用程序将一个Preference实例注入您的应用程序.如果只是将Preference作为参数在构造函数中用于依赖它的任何其他类,则可以在没有DI框架的情况下执行此操作.

编辑:让我举一个没有框架的依赖注入的例子.参加以下课程:

public class Preference
{
    private String userName;

    public Preference(String userName)
    {
        this.userName = userName;
    }

    public void savePreference()
    {
        // Default implementation saves it to the screen. ;-)
       System.out.println(userName);
    }
}

public class Foo
{
    private Preference p;

    public Foo(Preference p)
    {
        this.p = p;
    }
}

public class Bar
{
    private Preference p;

    public Bar(Preference p)
    {
        this.p = p;
    }
}

public class Main
{
    public static void main(String[] args)
    {
        Preference p = new Preference("Mike");

        Foo f = new Foo(p);
        Bar b = new Bar(p);
    }
}

这是一个简单的例子,但它满足您的要求:

> Preference实例仅创建一次
> Preference类可以通过实现Main类的任何人来扩展,以实例化他们想要的任何类型的Preference子类,如果他们想要将它保存在关系数据库(或其他)中

通过避免首先进行静态调用,您还可以对someFunction()示例进行单元测试,而无需引入潜在的大型复杂首选项框架.相反,有人实现了一个模拟Preference子类并将其传递给运行someFunction()的类.您的代码将以这种方式更加可测试.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读