小编zgg*_*ame的帖子

"不可变类"的Java构造函数,其中包含许多具有默认值的字段?

我有一个包含大量字段的JAVA类.它们基本上应该在构造函数阶段设置,永远不会改变.从语义上讲,类是不可变的.

public class A{
    final int a;
    final short b;
    final double e;
    final String f;
    final String g;
    //and more
}
Run Code Online (Sandbox Code Playgroud)

问题是通常这些字段具有默认值,因此我不希望总是给用户带来包含所有这些字段的构造函数.大多数时候,他们只需要设置几个.有几种方法可以解决这个问题:

  1. 我需要很多具有不同签名的构造函数.
  2. 创建一堆这些字段的set方法,只设置那些非默认值.但这在某种程度上表明了除了不可变性质之外的不同语义.
  3. 创建一个可变的新参数类,并将该类用作构造函数.

这些都不是完全令人满意的.还有其他方法吗?谢谢.单程

java oop design-patterns

21
推荐指数
2
解决办法
3856
查看次数

如何为一些Java枚举添加常用方法?(抽象类祖先?)

我有一些Java枚举

public enum Aggregation
{
    MORTGAGE( "Mortgage" ),
    POOLS( "Pools" ),
    PORTFOLIO( "Portfolio" );

    private Aggregation( final String name )
    {
        m_Name = name;
    }
    private String m_Name;
    static Map< String, Aggregation > c_LOOKUP =
        new HashMap< String, Aggregation >();
    static {
        for (Aggregation agg:values()){
            c_LOOKUP.put(agg.m_Name,agg);
        }
    }

    public Aggregation lookup(String name){
        return c_LOOKUP.get( name );
    }

    @Override
    public String toString()
    {
        return m_Name;
    }
}

public enum Interval
{
    MONTHLY( "Monthly" ),
    QUARTLY( "Quartly" ),
    SEMIANNUALLY( "SemiAnnually" ),
    ANNUALLY("Annually"); …
Run Code Online (Sandbox Code Playgroud)

java oop inheritance enums

13
推荐指数
3
解决办法
1万
查看次数

如何为新任务类型扩展Gradle任务的行为?

我想为一些测试任务设置一些东西.更具体地说,我想添加一些环境变量和一些系统属性,可能还有一些其他的东西,比如"dependencies"或"workingDir".通过常规Test任务,我可以做到这一点,

task test1(type:Test, dependsOn:[testPrep,testPrep1]){
     workingDir testWorkingPath
     systemProperty 'property','abs'
     environment.find { it.key ==~ /(?i)PATH/ }.value += (System.properties['path.separator'] + myLibPath)
     environment.LD_LIBRARY_PATH = "/usr/lib64:/lib64:${myLibPath}:" + environment.LD_LIBRARY_PATH
 }

task test2(type:Test, dependsOn:[testPrep]){
     workingDir testWorkingPath
     systemProperty 'property','abs'
     environment.find { it.key ==~ /(?i)PATH/ }.value += (System.properties['path.separator'] + myLibPath)
     environment.LD_LIBRARY_PATH = "/usr/lib64:/lib64:${myLibPath}:" + environment.LD_LIBRARY_PATH
     systemPropety 'newProperty','fdsjfkd'
 }
Run Code Online (Sandbox Code Playgroud)

如果有一个新的任务类型MyTestType扩展常规的Test任务类型,定义了通用定义,那就太好了.

task test1(type:MyTestType){
     dependsOn testPrep1
 }

task test2(type:MyTestType){
     systemPropety 'newProperty','fdsjfkd'
 } 
Run Code Online (Sandbox Code Playgroud)

最好的方法是什么?似乎该execute()方法是最终的,不能扩展.我需要做一些像doFirst设置这些属性的事情.我应该在构造函数中添加所有额外的值吗?我可以使用其他任何钩子吗?谢谢.

groovy task gradle

8
推荐指数
1
解决办法
7750
查看次数

标签 统计

java ×2

oop ×2

design-patterns ×1

enums ×1

gradle ×1

groovy ×1

inheritance ×1

task ×1