-2

チャンネルが 99 しかなく、最大音量が 20 の TV クラスがありますが、デフォルトの音量である 1 を 10 に追加するのではなく、音量に 1 つを追加すると、音量とチャンネル設定器が正しく機能しません。与えられた音量の数字私のテレビクラス

public class TV
{
    private String flag;
    private int ch;
    private int vol = 10;

    public TV(String onOffSwitch, int channel, int volume)
    {
        flag = onOffSwitch;
        ch = channel;
        vol = volume;
    }

    public void setFlag(String onOffSwitch)
    {
        onOffSwitch = "Off";
    }// End of setFlag

    public String getFlag()
    {
        return flag;
    }// End of getFlag

    public void setCh (int newChannel)
    {
        if (newChannel >= 99)
        {
            ch = 99;
        }else
        {
            ch = newChannel;
        }

        if(newChannel < 0)
        {
            ch = 0;
        }
    }//end of setCh

    public int getCh ()
    {
        return ch;
    }// End of getCh

    public void setVol(int newVolume)
    {
        if(newVolume >= 20)
        {
            vol = 20;
        }

        if(newVolume < 0)
        {
            vol=0;
        }
    }// End of SetVolume

    public void incrementVolume()
    {
        vol++;
    }

    public int getVol()
    {
        return vol;
    }// ENd of getVolume

    public String toString()
    {
        return String.format("%s :%s\n%s:%d\n%s :%d","TV is switched", flag,"TV channel",ch,"TV volume",vol);
    }

}// End of TV class

私のテスト ドライブ クラス

import java.util.Scanner;

public class TvTest
{
    public static void main (String[] args)
    {
        String tvStatus;
        int chan;
        int volu;

        Scanner input = new Scanner(System.in);
        TV tv2 = new TV("off",105,10);

        System.out.print(tv2);
        System.out.println();

        System.out.print("Turn TV On or Off ?");
        tvStatus = input.nextLine();

        System.out.print("Channel : ");
        chan = input.nextInt();

        System.out.print("Volume : ");
        volu = input.nextInt();

        TV tv1 = new TV(tvStatus,chan,volu);
        tv1.incrementVolume();

        System.out.println(tv1);
    }
}

そしてテスト出力

TV is switched :off
TV channel:105
TV volume :10
Turn TV On or Off ?on
Channel : 105
Volume : 1
TV is switched :on
TV channel:105
TV volume :2

セッターが機能しないのはなぜですか???

4

5 に答える 5

2

コンストラクターはセッターを使用する必要があります。

public TV(String onOffSwitch, int channel, int volume)
{
    this.setFlag(onOffSwitch);
    this.setCh(channel);
    this.setVol(volume);
}

setFlag はflag、渡された値に設定する必要があります。

public void setFlag(String onOffSwitch)
{
    this.flag = onOffSwitch;
}// End of setFlag
于 2013-03-18T03:29:35.223 に答える
1
public void setFlag(String onOffSwitch)
{
    onOffSwitch = "Off";
}// End of setFlag

onOffSwitch変数はフィールドではありません。これはパラメーター リストの名前であり、flag代わりに使用する必要があります。

于 2013-03-18T03:24:13.717 に答える
1
 public void setVol(int newVolume)
    {
        if(newVolume >= 20)
        {
            vol = 20;
        }

        if(newVolume < 0)
        {
            vol=0;
        }
    }// End of SetVolume

新しい値が範囲外でない限り、そのセッターは何もしません。

于 2013-03-18T03:36:51.867 に答える
0

私は一日中飲んでいるので、これを覚えておいてください、しかし、あなたがこの基本的な任務を終えることができなかったので、あなたもそうだったと思います。 p

まず、決して、決して、2つの状態の値を表すために文字列を使用することを意味します。ブール値は素晴らしいので、それらを使用してください。

class Televsion {
    power = false; # off
    power = true;  # on
}

第二に、あなたの変数名は最悪です。意味はありませんが、プログラムを不必要に複雑にする、それらの間で一致するかなりのミスがあります。また、省略形や省略形の変数名は使用しないでください。これがおそらく20年前か10年前かは理解できますが、最近のエディターには、1つまたは2つのキーストロークでコードを入力するのに役立つオートコンプリート機能がある傾向があります。

「これ」というキーワードについてはまだ学んでいないようです。クラス内で「this」を使用すると、その特異性により、クラスから特定の変数またはメソッドが呼び出されます。主なポイントは、引数とローカル変数からの名前の衝突を回避できることです。

class Televsion {
    private boolean power;
    private int channel;
    private int volume;

    public Televsion(  boolean power, int channel, int volume ) {
        this.power = power;
        this.channel= channel;
        this.volume = volume;
    }
}

このように、それは読者にとってもう少し賢いです; P

mainメソッドでコードをテストするのは、初心者と敗者です。JUnitは仮想的にJavaに組み込まれているので、使用しないでください。または、TestNGを使用することもできます^。^

テストスイートを構築すると、コードの設計とやり直しが簡単になります。

また、ハムクレストもご覧になることをお勧めします。

public TelevsionTest {
    private Televsion televsion;

    @Before
    public void boilerplateSetUpCode() {
        // The before annonation has it's roots in apsectJ, I beleve.
        // In this context it makes this method run before every test.

        televsion = new Televsion();
    }

    @Test
    public void testSwitchOn() {
        televsion.switchOn();
        assertTrue( televsion.getPowerState() == true ); 
        # JUnits assertions are weak, that's why I like hamcrest.
    }
}

再利用性と保守性のためにコーディングしてみてください。これにより、長期的には生活が楽になりますが、ショットの観点からは課題になります。ケーブルまたは衛星を入手した場合、これはチャンネル番号に影響しますか?

これが私が問題をやり直す方法についての5分間のハックです。

パブリッククラスTelevsion{プライベートLogger4jロガー;

private ChannelSource channelSource; // Naming is a little weak
private int volume;
private boolean power;

public Tv() {
    channelSource= channelSource.LOCAL;
    volume = 0;
    power = false;
}

public turnOn(){ power = true; }
public void turnOff() { power = false; }
public void muteVolume() { volume = 0; }
public void setVolume( volume ) {
    if ( volume > -1 && volume < 100 ) {
        this.volume = volume;
    } else {
        logger.dubug( String.format("Arg: %d", volume) );
        // This is anti-pattern of how not to word a debugging statement.
        // Plus, I'm lazy...
    }
}
public void changeChannelSource( ChannelSource channelSource ) {
    this.channelSource = channelSource;
}
public void changeChannelNumber( int channelNumber ) {
    channelSource.changeChannelNumber( channelNumber );
}

// I like singletons 
public enum ChannelSource {
    LOCAL(0), ALT(0), CABLE(0);

    private int channelNumber;

    private ChannelSource( int channelNumber ) {
        this.channelNumber = channelNumber ;
    }        


    public int getChannelNumber() { return channelNumber; }
    public void setChannelNumber( channelNumber ) {
        // Lazy hack
        if ( this.getName() == "LOCAL" ) {
            if ( channelNumber > -1 && channelNumber < 100 ) {
                this.channelNumber = channelNumber;
            } else {
                logger.debug( 
                    String.format("Unable to change %s, channel to %d", this.getName(), channelNumber) 
                );
            }
        }
    }
}

}

うまくいけば、コーディング標準を改善し始め、優れたプログラミング手法を学び始めれば、実際のStackExchangeアカウントを作成するのに十分なコーディングを楽しむことができます:)

これは、Javaの先生を幸せにするために学ぶべきことの簡単なリストです。

- Unit Testing
   + Might as well let a computer grade the code then a human, free A's

- Data Structures
   + Just using collections good enough.  
   + Side rant, If use this style of matrices, Object[][] I will haunt you down.
      - It's inefficient, plus hard for people maintaining this shitty code
      - Jagged arrays can work just as well List< List<Object> > or you can even just use a single array, [] and sprinkle in some magic.

- Annotations
   + Helps takes the Java out of Java

- Read Effective Java
   + It's not a difficult book, will make life easier.

- Know a little about concurrency
   + If you use the synchronized keyword, then you know something is wrong.
   + Take a look into concurrent utils API
   + Read Java Concurrency in Practice

- Spring
   + If you want to get paid for knowing Java

私が省略していることは他にもたくさんあると思いますが、Javaを学び始めた人にとってはそれで十分なはずです。

于 2013-03-18T05:32:36.010 に答える
0

問題はセッター/ゲッターにはありません (少し奇妙に見えますが)、問題は、コンストラクターでそれらを無視していることです...

public TV(String onOffSwitch, int channel, int volume)
{
    flag = onOffSwitch;
    ch = channel;
    vol = volume;
}

次のようなものを使用してみてください

public TV(String onOffSwitch, int channel, int volume)
{
    setFlag(flag);
    setCh(channel);
    setVol(volume);
}

その代わり...

変数onOffSwitchも未定義であるため、例はコンパイルされません;)。次のように読む必要があります...

public void setFlag(String onOffSwitch)
{
    flag = onOffSwitch;
}// End of setFlag

気をつけてください、私はおそらくboolean値を使用しturnOnturnOffメソッドを持っていますが、それは私だけです...

于 2013-03-18T03:30:14.290 に答える